Completed
Branch BUG/fatal-with-paypal-debug-li... (3a6198)
by
unknown
09:03 queued 40s
created
core/db_classes/EE_Extra_Meta.class.php 2 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
      * Sets FK_ID
47 47
      *
48 48
      * @param int $FK_ID
49
-     * @return boolean
49
+     * @return boolean|null
50 50
      */
51 51
     public function set_FK_ID($FK_ID)
52 52
     {
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
      * Sets model
70 70
      *
71 71
      * @param string $model
72
-     * @return boolean
72
+     * @return boolean|null
73 73
      */
74 74
     public function set_model($model)
75 75
     {
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
      * Sets key
93 93
      *
94 94
      * @param string $key
95
-     * @return boolean
95
+     * @return boolean|null
96 96
      */
97 97
     public function set_key($key)
98 98
     {
@@ -115,7 +115,7 @@  discard block
 block discarded – undo
115 115
      * Sets value
116 116
      *
117 117
      * @param string $value
118
-     * @return boolean
118
+     * @return boolean|null
119 119
      */
120 120
     public function set_value($value)
121 121
     {
Please login to merge, or discard this patch.
Indentation   +111 added lines, -111 removed lines patch added patch discarded remove patch
@@ -10,115 +10,115 @@
 block discarded – undo
10 10
 class EE_Extra_Meta extends EE_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $props_n_values
15
-     * @return EE_Extra_Meta|mixed
16
-     */
17
-    public static function new_instance($props_n_values = array())
18
-    {
19
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
-        return $has_object ? $has_object : new self($props_n_values);
21
-    }
22
-
23
-
24
-    /**
25
-     * @param array $props_n_values
26
-     * @return EE_Extra_Meta
27
-     */
28
-    public static function new_instance_from_db($props_n_values = array())
29
-    {
30
-        return new self($props_n_values, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Gets FK_ID
36
-     *
37
-     * @return int
38
-     */
39
-    public function FK_ID()
40
-    {
41
-        return $this->get('FK_ID');
42
-    }
43
-
44
-
45
-    /**
46
-     * Sets FK_ID
47
-     *
48
-     * @param int $FK_ID
49
-     * @return boolean
50
-     */
51
-    public function set_FK_ID($FK_ID)
52
-    {
53
-        $this->set('FK_ID', $FK_ID);
54
-    }
55
-
56
-
57
-    /**
58
-     * Gets model
59
-     *
60
-     * @return string
61
-     */
62
-    public function model()
63
-    {
64
-        return $this->get('EXM_model');
65
-    }
66
-
67
-
68
-    /**
69
-     * Sets model
70
-     *
71
-     * @param string $model
72
-     * @return boolean
73
-     */
74
-    public function set_model($model)
75
-    {
76
-        $this->set('EXM_model', $model);
77
-    }
78
-
79
-
80
-    /**
81
-     * Gets key
82
-     *
83
-     * @return string
84
-     */
85
-    public function key()
86
-    {
87
-        return $this->get('EXM_key');
88
-    }
89
-
90
-
91
-    /**
92
-     * Sets key
93
-     *
94
-     * @param string $key
95
-     * @return boolean
96
-     */
97
-    public function set_key($key)
98
-    {
99
-        $this->set('EXM_key', $key);
100
-    }
101
-
102
-
103
-    /**
104
-     * Gets value
105
-     *
106
-     * @return string
107
-     */
108
-    public function value()
109
-    {
110
-        return $this->get('EXM_value');
111
-    }
112
-
113
-
114
-    /**
115
-     * Sets value
116
-     *
117
-     * @param string $value
118
-     * @return boolean
119
-     */
120
-    public function set_value($value)
121
-    {
122
-        $this->set('EXM_value', $value);
123
-    }
13
+	/**
14
+	 * @param array $props_n_values
15
+	 * @return EE_Extra_Meta|mixed
16
+	 */
17
+	public static function new_instance($props_n_values = array())
18
+	{
19
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
+		return $has_object ? $has_object : new self($props_n_values);
21
+	}
22
+
23
+
24
+	/**
25
+	 * @param array $props_n_values
26
+	 * @return EE_Extra_Meta
27
+	 */
28
+	public static function new_instance_from_db($props_n_values = array())
29
+	{
30
+		return new self($props_n_values, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Gets FK_ID
36
+	 *
37
+	 * @return int
38
+	 */
39
+	public function FK_ID()
40
+	{
41
+		return $this->get('FK_ID');
42
+	}
43
+
44
+
45
+	/**
46
+	 * Sets FK_ID
47
+	 *
48
+	 * @param int $FK_ID
49
+	 * @return boolean
50
+	 */
51
+	public function set_FK_ID($FK_ID)
52
+	{
53
+		$this->set('FK_ID', $FK_ID);
54
+	}
55
+
56
+
57
+	/**
58
+	 * Gets model
59
+	 *
60
+	 * @return string
61
+	 */
62
+	public function model()
63
+	{
64
+		return $this->get('EXM_model');
65
+	}
66
+
67
+
68
+	/**
69
+	 * Sets model
70
+	 *
71
+	 * @param string $model
72
+	 * @return boolean
73
+	 */
74
+	public function set_model($model)
75
+	{
76
+		$this->set('EXM_model', $model);
77
+	}
78
+
79
+
80
+	/**
81
+	 * Gets key
82
+	 *
83
+	 * @return string
84
+	 */
85
+	public function key()
86
+	{
87
+		return $this->get('EXM_key');
88
+	}
89
+
90
+
91
+	/**
92
+	 * Sets key
93
+	 *
94
+	 * @param string $key
95
+	 * @return boolean
96
+	 */
97
+	public function set_key($key)
98
+	{
99
+		$this->set('EXM_key', $key);
100
+	}
101
+
102
+
103
+	/**
104
+	 * Gets value
105
+	 *
106
+	 * @return string
107
+	 */
108
+	public function value()
109
+	{
110
+		return $this->get('EXM_value');
111
+	}
112
+
113
+
114
+	/**
115
+	 * Sets value
116
+	 *
117
+	 * @param string $value
118
+	 * @return boolean
119
+	 */
120
+	public function set_value($value)
121
+	{
122
+		$this->set('EXM_value', $value);
123
+	}
124 124
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Import.class.php 3 patches
Doc Comments   +4 added lines, -8 removed lines patch added patch discarded remove patch
@@ -87,7 +87,6 @@  discard block
 block discarded – undo
87 87
      *
88 88
      * @param    string $title  - heading for the form
89 89
      * @param    string $intro  - additional text explaing what to do
90
-     * @param    string $page   - EE Admin page to direct form to - in the form "espresso_{pageslug}"
91 90
      * @param    string $action - EE Admin page route array "action" that form will direct to
92 91
      * @param    string $type   - type of file to import
93 92
      *                          @ return    string
@@ -130,7 +129,7 @@  discard block
 block discarded – undo
130 129
     /**
131 130
      * @Import Event Espresso data - some code "borrowed" from event espresso csv_import.php
132 131
      * @access public
133
-     * @return boolean success
132
+     * @return boolean|null success
134 133
      */
135 134
     public function import()
136 135
     {
@@ -304,9 +303,7 @@  discard block
 block discarded – undo
304 303
      * @access public
305 304
      * @param array $csv_data_array - the array containing the csv data produced from
306 305
      *                              EE_CSV::import_csv_to_model_data_array()
307
-     * @param array $fields_to_save - an array containing the csv column names as keys with the corresponding db table
308
-     *                              fields they will be saved to
309
-     * @return TRUE on success, FALSE on fail
306
+     * @return boolean on success, FALSE on fail
310 307
      * @throws \EE_Error
311 308
      */
312 309
     public function save_csv_data_array_to_db($csv_data_array, $model_name = false)
@@ -459,7 +456,7 @@  discard block
 block discarded – undo
459 456
      * to the newly-inserted real ID.
460 457
      *
461 458
      * @param type $csv_data_array
462
-     * @param type $export_from_site_a_to_b
459
+     * @param boolean $export_from_site_a_to_b
463 460
      * @param type $old_db_to_new_db_mapping
464 461
      * @return array updated $old_db_to_new_db_mapping
465 462
      */
@@ -626,7 +623,6 @@  discard block
 block discarded – undo
626 623
      * @param type     $id_in_csv
627 624
      * @param type     $model_object_data
628 625
      * @param EEM_Base $model
629
-     * @param type     $old_db_to_new_db_mapping
630 626
      * @return
631 627
      */
632 628
     protected function _decide_whether_to_insert_or_update_given_data_from_same_db(
@@ -758,7 +754,7 @@  discard block
 block discarded – undo
758 754
      * @param type   $object_id
759 755
      * @param string $model_name
760 756
      * @param array  $old_db_to_new_db_mapping
761
-     * @param type   $export_from_site_a_to_b
757
+     * @param boolean   $export_from_site_a_to_b
762 758
      * @return int
763 759
      */
764 760
     protected function _find_mapping_in($object_id, $model_name, $old_db_to_new_db_mapping, $export_from_site_a_to_b)
Please login to merge, or discard this patch.
Indentation   +950 added lines, -950 removed lines patch added patch discarded remove patch
@@ -14,91 +14,91 @@  discard block
 block discarded – undo
14 14
 class EE_Import implements ResettableInterface
15 15
 {
16 16
 
17
-    const do_insert = 'insert';
18
-    const do_update = 'update';
19
-    const do_nothing = 'nothing';
20
-
21
-
22
-    // instance of the EE_Import object
23
-    private static $_instance = null;
24
-
25
-    private static $_csv_array = array();
26
-
27
-    /**
28
-     *
29
-     * @var array of model names
30
-     */
31
-    private static $_model_list = array();
32
-
33
-    private static $_columns_to_save = array();
34
-
35
-    protected $_total_inserts = 0;
36
-    protected $_total_updates = 0;
37
-    protected $_total_insert_errors = 0;
38
-    protected $_total_update_errors = 0;
39
-
40
-
41
-    /**
42
-     *        private constructor to prevent direct creation
43
-     *
44
-     * @Constructor
45
-     * @access private
46
-     * @return void
47
-     */
48
-    private function __construct()
49
-    {
50
-        $this->_total_inserts = 0;
51
-        $this->_total_updates = 0;
52
-        $this->_total_insert_errors = 0;
53
-        $this->_total_update_errors = 0;
54
-    }
55
-
56
-
57
-    /**
58
-     *    @ singleton method used to instantiate class object
59
-     *    @ access public
60
-     *
61
-     * @return EE_Import
62
-     */
63
-    public static function instance()
64
-    {
65
-        // check if class object is instantiated
66
-        if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_Import)) {
67
-            self::$_instance = new self();
68
-        }
69
-        return self::$_instance;
70
-    }
71
-
72
-    /**
73
-     * Resets the importer
74
-     *
75
-     * @return EE_Import
76
-     */
77
-    public static function reset()
78
-    {
79
-        self::$_instance = null;
80
-        return self::instance();
81
-    }
82
-
83
-
84
-    /**
85
-     *    @ generates HTML for a file upload input and form
86
-     *    @ access    public
87
-     *
88
-     * @param    string $title  - heading for the form
89
-     * @param    string $intro  - additional text explaing what to do
90
-     * @param    string $page   - EE Admin page to direct form to - in the form "espresso_{pageslug}"
91
-     * @param    string $action - EE Admin page route array "action" that form will direct to
92
-     * @param    string $type   - type of file to import
93
-     *                          @ return    string
94
-     */
95
-    public function upload_form($title, $intro, $form_url, $action, $type)
96
-    {
97
-
98
-        $form_url = EE_Admin_Page::add_query_args_and_nonce(array('action' => $action), $form_url);
99
-
100
-        ob_start();
101
-        ?>
17
+	const do_insert = 'insert';
18
+	const do_update = 'update';
19
+	const do_nothing = 'nothing';
20
+
21
+
22
+	// instance of the EE_Import object
23
+	private static $_instance = null;
24
+
25
+	private static $_csv_array = array();
26
+
27
+	/**
28
+	 *
29
+	 * @var array of model names
30
+	 */
31
+	private static $_model_list = array();
32
+
33
+	private static $_columns_to_save = array();
34
+
35
+	protected $_total_inserts = 0;
36
+	protected $_total_updates = 0;
37
+	protected $_total_insert_errors = 0;
38
+	protected $_total_update_errors = 0;
39
+
40
+
41
+	/**
42
+	 *        private constructor to prevent direct creation
43
+	 *
44
+	 * @Constructor
45
+	 * @access private
46
+	 * @return void
47
+	 */
48
+	private function __construct()
49
+	{
50
+		$this->_total_inserts = 0;
51
+		$this->_total_updates = 0;
52
+		$this->_total_insert_errors = 0;
53
+		$this->_total_update_errors = 0;
54
+	}
55
+
56
+
57
+	/**
58
+	 *    @ singleton method used to instantiate class object
59
+	 *    @ access public
60
+	 *
61
+	 * @return EE_Import
62
+	 */
63
+	public static function instance()
64
+	{
65
+		// check if class object is instantiated
66
+		if (self::$_instance === null or ! is_object(self::$_instance) or ! (self::$_instance instanceof EE_Import)) {
67
+			self::$_instance = new self();
68
+		}
69
+		return self::$_instance;
70
+	}
71
+
72
+	/**
73
+	 * Resets the importer
74
+	 *
75
+	 * @return EE_Import
76
+	 */
77
+	public static function reset()
78
+	{
79
+		self::$_instance = null;
80
+		return self::instance();
81
+	}
82
+
83
+
84
+	/**
85
+	 *    @ generates HTML for a file upload input and form
86
+	 *    @ access    public
87
+	 *
88
+	 * @param    string $title  - heading for the form
89
+	 * @param    string $intro  - additional text explaing what to do
90
+	 * @param    string $page   - EE Admin page to direct form to - in the form "espresso_{pageslug}"
91
+	 * @param    string $action - EE Admin page route array "action" that form will direct to
92
+	 * @param    string $type   - type of file to import
93
+	 *                          @ return    string
94
+	 */
95
+	public function upload_form($title, $intro, $form_url, $action, $type)
96
+	{
97
+
98
+		$form_url = EE_Admin_Page::add_query_args_and_nonce(array('action' => $action), $form_url);
99
+
100
+		ob_start();
101
+		?>
102 102
         <div class="ee-upload-form-dv">
103 103
             <h3><?php echo $title; ?></h3>
104 104
             <p><?php echo $intro; ?></p>
@@ -114,874 +114,874 @@  discard block
 block discarded – undo
114 114
                 <b><?php _e('Attention', 'event_espresso'); ?></b><br/>
115 115
                 <?php echo sprintf(__('Accepts .%s file types only.', 'event_espresso'), $type); ?>
116 116
                 <?php echo __(
117
-                    'Please only import CSV files exported from Event Espresso, or compatible 3rd-party software.',
118
-                    'event_espresso'
119
-                ); ?>
117
+					'Please only import CSV files exported from Event Espresso, or compatible 3rd-party software.',
118
+					'event_espresso'
119
+				); ?>
120 120
             </p>
121 121
 
122 122
         </div>
123 123
 
124 124
         <?php
125
-        $uploader = ob_get_clean();
126
-        return $uploader;
127
-    }
128
-
129
-
130
-    /**
131
-     * @Import Event Espresso data - some code "borrowed" from event espresso csv_import.php
132
-     * @access public
133
-     * @return boolean success
134
-     */
135
-    public function import()
136
-    {
137
-
138
-        require_once(EE_CLASSES . 'EE_CSV.class.php');
139
-        $this->EE_CSV = EE_CSV::instance();
140
-
141
-        if (isset($_REQUEST['import'])) {
142
-            if (isset($_POST['csv_submitted'])) {
143
-                switch ($_FILES['file']['error'][0]) {
144
-                    case UPLOAD_ERR_OK:
145
-                        $error_msg = false;
146
-                        break;
147
-                    case UPLOAD_ERR_INI_SIZE:
148
-                        $error_msg = __(
149
-                            "'The uploaded file exceeds the upload_max_filesize directive in php.ini.'",
150
-                            "event_espresso"
151
-                        );
152
-                        break;
153
-                    case UPLOAD_ERR_FORM_SIZE:
154
-                        $error_msg = __(
155
-                            'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
156
-                            "event_espresso"
157
-                        );
158
-                        break;
159
-                    case UPLOAD_ERR_PARTIAL:
160
-                        $error_msg = __('The uploaded file was only partially uploaded.', "event_espresso");
161
-                        break;
162
-                    case UPLOAD_ERR_NO_FILE:
163
-                        $error_msg = __('No file was uploaded.', "event_espresso");
164
-                        break;
165
-                    case UPLOAD_ERR_NO_TMP_DIR:
166
-                        $error_msg = __('Missing a temporary folder.', "event_espresso");
167
-                        break;
168
-                    case UPLOAD_ERR_CANT_WRITE:
169
-                        $error_msg = __('Failed to write file to disk.', "event_espresso");
170
-                        break;
171
-                    case UPLOAD_ERR_EXTENSION:
172
-                        $error_msg = __('File upload stopped by extension.', "event_espresso");
173
-                        break;
174
-                    default:
175
-                        $error_msg = __(
176
-                            'An unknown error occurred and the file could not be uploaded',
177
-                            "event_espresso"
178
-                        );
179
-                        break;
180
-                }
181
-
182
-                if (! $error_msg) {
183
-                    $filename = $_FILES['file']['name'][0];
184
-                    $file_ext = substr(strrchr($filename, '.'), 1);
185
-                    $file_type = $_FILES['file']['type'][0];
186
-                    $temp_file = $_FILES['file']['tmp_name'][0];
187
-                    $filesize = $_FILES['file']['size'][0] / 1024;// convert from bytes to KB
188
-
189
-                    if ($file_ext == 'csv') {
190
-                        $max_upload = $this->EE_CSV->get_max_upload_size();// max upload size in KB
191
-                        if ($filesize < $max_upload || true) {
192
-                            $wp_upload_dir = str_replace(array('\\', '/'), '/', wp_upload_dir());
193
-                            $path_to_file = $wp_upload_dir['basedir'] . '/espresso/' . $filename;
194
-
195
-                            if (move_uploaded_file($temp_file, $path_to_file)) {
196
-                                // convert csv to array
197
-                                $this->csv_array = $this->EE_CSV->import_csv_to_model_data_array($path_to_file);
198
-
199
-                                // was data successfully stored in an array?
200
-                                if (is_array($this->csv_array)) {
201
-                                    $import_what = str_replace('csv_import_', '', $_REQUEST['action']);
202
-                                    $import_what = str_replace('_', ' ', ucwords($import_what));
203
-                                    $processed_data = $this->csv_array;
204
-                                    $this->columns_to_save = false;
205
-
206
-                                    // if any imports require funcky processing, we'll catch them in the switch
207
-                                    switch ($_REQUEST['action']) {
208
-                                        case "import_events":
209
-                                        case "event_list":
210
-                                            $import_what = 'Event Details';
211
-                                            break;
212
-
213
-                                        case 'groupon_import_csv':
214
-                                            $import_what = 'Groupon Codes';
215
-                                            $processed_data = $this->process_groupon_codes();
216
-                                            break;
217
-                                    }
218
-                                    // save processed codes to db
219
-                                    if ($this->save_csv_data_array_to_db($processed_data, $this->columns_to_save)) {
220
-                                        return true;
221
-                                    }
222
-                                } else {
223
-                                    // no array? must be an error
224
-                                    EE_Error::add_error(
225
-                                        sprintf(__("No file seems to have been uploaded", "event_espresso")),
226
-                                        __FILE__,
227
-                                        __FUNCTION__,
228
-                                        __LINE__
229
-                                    );
230
-                                    return false;
231
-                                }
232
-                            } else {
233
-                                EE_Error::add_error(
234
-                                    sprintf(__("%s was not successfully uploaded", "event_espresso"), $filename),
235
-                                    __FILE__,
236
-                                    __FUNCTION__,
237
-                                    __LINE__
238
-                                );
239
-                                return false;
240
-                            }
241
-                        } else {
242
-                            EE_Error::add_error(
243
-                                sprintf(
244
-                                    __(
245
-                                        "%s was too large of a file and could not be uploaded. The max filesize is %s' KB.",
246
-                                        "event_espresso"
247
-                                    ),
248
-                                    $filename,
249
-                                    $max_upload
250
-                                ),
251
-                                __FILE__,
252
-                                __FUNCTION__,
253
-                                __LINE__
254
-                            );
255
-                            return false;
256
-                        }
257
-                    } else {
258
-                        EE_Error::add_error(
259
-                            sprintf(__("%s  had an invalid file extension, not uploaded", "event_espresso"), $filename),
260
-                            __FILE__,
261
-                            __FUNCTION__,
262
-                            __LINE__
263
-                        );
264
-                        return false;
265
-                    }
266
-                } else {
267
-                    EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
268
-                    return false;
269
-                }
270
-            }
271
-        }
272
-        return;
273
-    }
274
-
275
-
276
-    /**
277
-     *    Given an array of data (usually from a CSV import) attempts to save that data to the db.
278
-     *    If $model_name ISN'T provided, assumes that this is a 3d array, with toplevel keys being model names,
279
-     *    next level being numeric indexes adn each value representing a model object, and the last layer down
280
-     *    being keys of model fields and their proposed values.
281
-     *    If $model_name IS provided, assumes a 2d array of the bottom two layers previously mentioned.
282
-     *    If the CSV data says (in the metadata row) that it's from the SAME database,
283
-     *    we treat the IDs in the CSV as the normal IDs, and try to update those records. However, if those
284
-     *    IDs DON'T exist in the database, they're treated as temporary IDs,
285
-     *    which can used elsewhere to refer to the same object. Once an item
286
-     *    with a temporary ID gets inserted, we record its mapping from temporary
287
-     *    ID to real ID, and use the real ID in place of the temporary ID
288
-     *    when that temporary ID was used as a foreign key.
289
-     *    If the CSV data says (in the metadata again) that it's from a DIFFERENT database,
290
-     *    we treat all the IDs in the CSV as temporary ID- eg, if the CSV specifies an event with
291
-     *    ID 1, and the database already has an event with ID 1, we assume that's just a coincidence,
292
-     *    and insert a new event, and map it's temporary ID of 1 over to its new real ID.
293
-     *    An important exception are non-auto-increment primary keys. If one entry in the
294
-     *    CSV file has the same ID as one in the DB, we assume they are meant to be
295
-     *    the same item, and instead update the item in the DB with that same ID.
296
-     *    Also note, we remember the mappings permanently. So the 2nd, 3rd, and 10000th
297
-     *    time you import a CSV from a different site, we remember their mappings, and
298
-     * will try to update the item in the DB instead of inserting another item (eg
299
-     * if we previously imported an event with temporary ID 1, and then it got a
300
-     * real ID of 123, we remember that. So the next time we import an event with
301
-     * temporary ID, from the same site, we know that it's real ID is 123, and will
302
-     * update that event, instead of adding a new event).
303
-     *
304
-     * @access public
305
-     * @param array $csv_data_array - the array containing the csv data produced from
306
-     *                              EE_CSV::import_csv_to_model_data_array()
307
-     * @param array $fields_to_save - an array containing the csv column names as keys with the corresponding db table
308
-     *                              fields they will be saved to
309
-     * @return TRUE on success, FALSE on fail
310
-     * @throws \EE_Error
311
-     */
312
-    public function save_csv_data_array_to_db($csv_data_array, $model_name = false)
313
-    {
314
-        $success = false;
315
-        $error = false;
316
-        // whther to treat this import as if it's data froma different database or not
317
-        // ie, if it IS from a different database, ignore foreign keys whihf
318
-        $export_from_site_a_to_b = true;
319
-        // first level of array is not table information but a table name was passed to the function
320
-        // array is only two levels deep, so let's fix that by adding a level, else the next steps will fail
321
-        if ($model_name) {
322
-            $csv_data_array = array($csv_data_array);
323
-        }
324
-        // begin looking through the $csv_data_array, expecting the toplevel key to be the model's name...
325
-        $old_site_url = 'none-specified';
326
-        // hanlde metadata
327
-        if (isset($csv_data_array[ EE_CSV::metadata_header ])) {
328
-            $csv_metadata = array_shift($csv_data_array[ EE_CSV::metadata_header ]);
329
-            // ok so its metadata, dont try to save it to ehte db obviously...
330
-            if (isset($csv_metadata['site_url']) && $csv_metadata['site_url'] == site_url()) {
331
-                EE_Error::add_attention(
332
-                    sprintf(
333
-                        __(
334
-                            "CSV Data appears to be from the same database, so attempting to update data",
335
-                            "event_espresso"
336
-                        )
337
-                    )
338
-                );
339
-                $export_from_site_a_to_b = false;
340
-            } else {
341
-                $old_site_url = isset($csv_metadata['site_url']) ? $csv_metadata['site_url'] : $old_site_url;
342
-                EE_Error::add_attention(
343
-                    sprintf(
344
-                        __(
345
-                            "CSV Data appears to be from a different database (%s instead of %s), so we assume IDs in the CSV data DO NOT correspond to IDs in this database",
346
-                            "event_espresso"
347
-                        ),
348
-                        $old_site_url,
349
-                        site_url()
350
-                    )
351
-                );
352
-            };
353
-            unset($csv_data_array[ EE_CSV::metadata_header ]);
354
-        }
355
-        /**
356
-         * @var $old_db_to_new_db_mapping 2d array: toplevel keys being model names, bottom-level keys being the original key, and
357
-         * the value will be the newly-inserted ID.
358
-         * If we have already imported data from the same website via CSV, it shoudl be kept in this wp option
359
-         */
360
-        $old_db_to_new_db_mapping = get_option('ee_id_mapping_from' . sanitize_title($old_site_url), array());
361
-        if ($old_db_to_new_db_mapping) {
362
-            EE_Error::add_attention(
363
-                sprintf(
364
-                    __(
365
-                        "We noticed you have imported data via CSV from %s before. Because of this, IDs in your CSV have been mapped to their new IDs in %s",
366
-                        "event_espresso"
367
-                    ),
368
-                    $old_site_url,
369
-                    site_url()
370
-                )
371
-            );
372
-        }
373
-        $old_db_to_new_db_mapping = $this->save_data_rows_to_db(
374
-            $csv_data_array,
375
-            $export_from_site_a_to_b,
376
-            $old_db_to_new_db_mapping
377
-        );
378
-
379
-        // save the mapping from old db to new db in case they try re-importing the same data from the same website again
380
-        update_option('ee_id_mapping_from' . sanitize_title($old_site_url), $old_db_to_new_db_mapping);
381
-
382
-        if ($this->_total_updates > 0) {
383
-            EE_Error::add_success(
384
-                sprintf(
385
-                    __("%s existing records in the database were updated.", "event_espresso"),
386
-                    $this->_total_updates
387
-                )
388
-            );
389
-            $success = true;
390
-        }
391
-        if ($this->_total_inserts > 0) {
392
-            EE_Error::add_success(
393
-                sprintf(__("%s new records were added to the database.", "event_espresso"), $this->_total_inserts)
394
-            );
395
-            $success = true;
396
-        }
397
-
398
-        if ($this->_total_update_errors > 0) {
399
-            EE_Error::add_error(
400
-                sprintf(
401
-                    __(
402
-                        "'One or more errors occurred, and a total of %s existing records in the database were <strong>not</strong> updated.'",
403
-                        "event_espresso"
404
-                    ),
405
-                    $this->_total_update_errors
406
-                ),
407
-                __FILE__,
408
-                __FUNCTION__,
409
-                __LINE__
410
-            );
411
-            $error = true;
412
-        }
413
-        if ($this->_total_insert_errors > 0) {
414
-            EE_Error::add_error(
415
-                sprintf(
416
-                    __(
417
-                        "One or more errors occurred, and a total of %s new records were <strong>not</strong> added to the database.'",
418
-                        "event_espresso"
419
-                    ),
420
-                    $this->_total_insert_errors
421
-                ),
422
-                __FILE__,
423
-                __FUNCTION__,
424
-                __LINE__
425
-            );
426
-            $error = true;
427
-        }
428
-
429
-        // lastly, we need to update the datetime and ticket sold amounts
430
-        // as those may have been affected by this
431
-        EEM_Ticket::instance()->update_tickets_sold(EEM_Ticket::instance()->get_all());
432
-
433
-        // if there was at least one success and absolutely no errors
434
-        if ($success && ! $error) {
435
-            return true;
436
-        } else {
437
-            return false;
438
-        }
439
-    }
440
-
441
-
442
-    /**
443
-     * Processes the array of data, given the knowledge that it's from the same database or a different one,
444
-     * and the mapping from temporary IDs to real IDs.
445
-     * If the data is from a different database, we treat the primary keys and their corresponding
446
-     * foreign keys as "temp Ids", basically identifiers that get mapped to real primary keys
447
-     * in the real target database. As items are inserted, their temporary primary keys
448
-     * are mapped to the real IDs in the target database. Also, before doing any update or
449
-     * insert, we replace all the temp ID which are foreign keys with their mapped real IDs.
450
-     * An exception: string primary keys are treated as real IDs, or else we'd need to
451
-     * dynamically generate new string primary keys which would be very awkard for the country table etc.
452
-     * Also, models with no primary key are strange too. We combine use their primar key INDEX (a
453
-     * combination of fields) to create a unique string identifying the row and store
454
-     * those in the mapping.
455
-     *
456
-     * If the data is from the same database, we usually treat primary keys as real IDs.
457
-     * An exception is if there is nothing in the database for that ID. If that's the case,
458
-     * we need to insert a new row for that ID, and then map from the non-existent ID
459
-     * to the newly-inserted real ID.
460
-     *
461
-     * @param type $csv_data_array
462
-     * @param type $export_from_site_a_to_b
463
-     * @param type $old_db_to_new_db_mapping
464
-     * @return array updated $old_db_to_new_db_mapping
465
-     */
466
-    public function save_data_rows_to_db($csv_data_array, $export_from_site_a_to_b, $old_db_to_new_db_mapping)
467
-    {
468
-        foreach ($csv_data_array as $model_name_in_csv_data => $model_data_from_import) {
469
-            // now check that assumption was correct. If
470
-            if (EE_Registry::instance()->is_model_name($model_name_in_csv_data)) {
471
-                $model_name = $model_name_in_csv_data;
472
-            } else {
473
-                // no table info in the array and no table name passed to the function?? FAIL
474
-                EE_Error::add_error(
475
-                    __(
476
-                        'No table information was specified and/or found, therefore the import could not be completed',
477
-                        'event_espresso'
478
-                    ),
479
-                    __FILE__,
480
-                    __FUNCTION__,
481
-                    __LINE__
482
-                );
483
-                return false;
484
-            }
485
-            /* @var $model EEM_Base */
486
-            $model = EE_Registry::instance()->load_model($model_name);
487
-
488
-            // so without further ado, scanning all the data provided for primary keys and their inital values
489
-            foreach ($model_data_from_import as $model_object_data) {
490
-                // before we do ANYTHING, make sure the csv row wasn't just completely blank
491
-                $row_is_completely_empty = true;
492
-                foreach ($model_object_data as $field) {
493
-                    if ($field) {
494
-                        $row_is_completely_empty = false;
495
-                    }
496
-                }
497
-                if ($row_is_completely_empty) {
498
-                    continue;
499
-                }
500
-                // find the PK in the row of data (or a combined key if
501
-                // there is no primary key)
502
-                if ($model->has_primary_key_field()) {
503
-                    $id_in_csv = $model_object_data[ $model->primary_key_name() ];
504
-                } else {
505
-                    $id_in_csv = $model->get_index_primary_key_string($model_object_data);
506
-                }
507
-
508
-
509
-                $model_object_data = $this->_replace_temp_ids_with_mappings(
510
-                    $model_object_data,
511
-                    $model,
512
-                    $old_db_to_new_db_mapping,
513
-                    $export_from_site_a_to_b
514
-                );
515
-                // now we need to decide if we're going to add a new model object given the $model_object_data,
516
-                // or just update.
517
-                if ($export_from_site_a_to_b) {
518
-                    $what_to_do = $this->_decide_whether_to_insert_or_update_given_data_from_other_db(
519
-                        $id_in_csv,
520
-                        $model_object_data,
521
-                        $model,
522
-                        $old_db_to_new_db_mapping
523
-                    );
524
-                } else {// this is just a re-import
525
-                    $what_to_do = $this->_decide_whether_to_insert_or_update_given_data_from_same_db(
526
-                        $id_in_csv,
527
-                        $model_object_data,
528
-                        $model,
529
-                        $old_db_to_new_db_mapping
530
-                    );
531
-                }
532
-                if ($what_to_do == self::do_nothing) {
533
-                    continue;
534
-                }
535
-
536
-                // double-check we actually want to insert, if that's what we're planning
537
-                // based on whether this item would be unique in the DB or not
538
-                if ($what_to_do == self::do_insert) {
539
-                    // we're supposed to be inserting. But wait, will this thing
540
-                    // be acceptable if inserted?
541
-                    $conflicting = $model->get_one_conflicting($model_object_data, false);
542
-                    if ($conflicting) {
543
-                        // ok, this item would conflict if inserted. Just update the item that it conflicts with.
544
-                        $what_to_do = self::do_update;
545
-                        // and if this model has a primary key, remember its mapping
546
-                        if ($model->has_primary_key_field()) {
547
-                            $old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ] = $conflicting->ID();
548
-                            $model_object_data[ $model->primary_key_name() ] = $conflicting->ID();
549
-                        } else {
550
-                            // we want to update this conflicting item, instead of inserting a conflicting item
551
-                            // so we need to make sure they match entirely (its possible that they only conflicted on one field, but we need them to match on other fields
552
-                            // for the WHERE conditions in the update). At the time of this comment, there were no models like this
553
-                            foreach ($model->get_combined_primary_key_fields() as $key_field) {
554
-                                $model_object_data[ $key_field->get_name() ] = $conflicting->get(
555
-                                    $key_field->get_name()
556
-                                );
557
-                            }
558
-                        }
559
-                    }
560
-                }
561
-                if ($what_to_do == self::do_insert) {
562
-                    $old_db_to_new_db_mapping = $this->_insert_from_data_array(
563
-                        $id_in_csv,
564
-                        $model_object_data,
565
-                        $model,
566
-                        $old_db_to_new_db_mapping
567
-                    );
568
-                } elseif ($what_to_do == self::do_update) {
569
-                    $old_db_to_new_db_mapping = $this->_update_from_data_array(
570
-                        $id_in_csv,
571
-                        $model_object_data,
572
-                        $model,
573
-                        $old_db_to_new_db_mapping
574
-                    );
575
-                } else {
576
-                    throw new EE_Error(
577
-                        sprintf(
578
-                            __(
579
-                                'Programming error. We shoudl be inserting or updating, but instead we are being told to "%s", whifh is invalid',
580
-                                'event_espresso'
581
-                            ),
582
-                            $what_to_do
583
-                        )
584
-                    );
585
-                }
586
-            }
587
-        }
588
-        return $old_db_to_new_db_mapping;
589
-    }
590
-
591
-
592
-    /**
593
-     * Decides whether or not to insert, given that this data is from another database.
594
-     * So, if the primary key of this $model_object_data already exists in the database,
595
-     * it's just a coincidence and we should still insert. The only time we should
596
-     * update is when we know what it maps to, or there's something that would
597
-     * conflict (and we should instead just update that conflicting thing)
598
-     *
599
-     * @param string   $id_in_csv
600
-     * @param array    $model_object_data        by reference so it can be modified
601
-     * @param EEM_Base $model
602
-     * @param array    $old_db_to_new_db_mapping by reference so it can be modified
603
-     * @return string one of the consts on this class that starts with do_*
604
-     */
605
-    protected function _decide_whether_to_insert_or_update_given_data_from_other_db(
606
-        $id_in_csv,
607
-        $model_object_data,
608
-        $model,
609
-        $old_db_to_new_db_mapping
610
-    ) {
611
-        $model_name = $model->get_this_model_name();
612
-        // if it's a site-to-site export-and-import, see if this modelobject's id
613
-        // in the old data that we know of
614
-        if (isset($old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ])) {
615
-            return self::do_update;
616
-        } else {
617
-            return self::do_insert;
618
-        }
619
-    }
620
-
621
-    /**
622
-     * If this thing basically already exists in the database, we want to update it;
623
-     * otherwise insert it (ie, someone tweaked the CSV file, or the item was
624
-     * deleted in the database so it should be re-inserted)
625
-     *
626
-     * @param type     $id_in_csv
627
-     * @param type     $model_object_data
628
-     * @param EEM_Base $model
629
-     * @param type     $old_db_to_new_db_mapping
630
-     * @return
631
-     */
632
-    protected function _decide_whether_to_insert_or_update_given_data_from_same_db(
633
-        $id_in_csv,
634
-        $model_object_data,
635
-        $model
636
-    ) {
637
-        // in this case, check if this thing ACTUALLY exists in the database
638
-        if ($model->get_one_conflicting($model_object_data)) {
639
-            return self::do_update;
640
-        } else {
641
-            return self::do_insert;
642
-        }
643
-    }
644
-
645
-    /**
646
-     * Using the $old_db_to_new_db_mapping array, replaces all the temporary IDs
647
-     * with their mapped real IDs. Eg, if importing from site A to B, the mapping
648
-     * file may indicate that the ID "my_event_id" maps to an actual event ID of 123.
649
-     * So this function searches for any event temp Ids called "my_event_id" and
650
-     * replaces them with 123.
651
-     * Also, if there is no temp ID for the INT foreign keys from another database,
652
-     * replaces them with 0 or the field's default.
653
-     *
654
-     * @param type     $model_object_data
655
-     * @param EEM_Base $model
656
-     * @param type     $old_db_to_new_db_mapping
657
-     * @param boolean  $export_from_site_a_to_b
658
-     * @return array updated model object data with temp IDs removed
659
-     */
660
-    protected function _replace_temp_ids_with_mappings(
661
-        $model_object_data,
662
-        $model,
663
-        $old_db_to_new_db_mapping,
664
-        $export_from_site_a_to_b
665
-    ) {
666
-        // if this model object's primary key is in the mapping, replace it
667
-        if ($model->has_primary_key_field() &&
668
-            $model->get_primary_key_field()->is_auto_increment() &&
669
-            isset($old_db_to_new_db_mapping[ $model->get_this_model_name() ]) &&
670
-            isset(
671
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $model_object_data[ $model->primary_key_name() ] ]
672
-            )) {
673
-            $model_object_data[ $model->primary_key_name() ] = $old_db_to_new_db_mapping[ $model->get_this_model_name(
674
-            ) ][ $model_object_data[ $model->primary_key_name() ] ];
675
-        }
676
-
677
-        try {
678
-            $model_name_field = $model->get_field_containing_related_model_name();
679
-            $models_pointed_to_by_model_name_field = $model_name_field->get_model_names_pointed_to();
680
-        } catch (EE_Error $e) {
681
-            $model_name_field = null;
682
-            $models_pointed_to_by_model_name_field = array();
683
-        }
684
-        foreach ($model->field_settings(true) as $field_obj) {
685
-            if ($field_obj instanceof EE_Foreign_Key_Int_Field) {
686
-                $models_pointed_to = $field_obj->get_model_names_pointed_to();
687
-                $found_a_mapping = false;
688
-                foreach ($models_pointed_to as $model_pointed_to_by_fk) {
689
-                    if ($model_name_field) {
690
-                        $value_of_model_name_field = $model_object_data[ $model_name_field->get_name() ];
691
-                        if ($value_of_model_name_field == $model_pointed_to_by_fk) {
692
-                            $model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
693
-                                $model_object_data[ $field_obj->get_name() ],
694
-                                $model_pointed_to_by_fk,
695
-                                $old_db_to_new_db_mapping,
696
-                                $export_from_site_a_to_b
697
-                            );
698
-                            $found_a_mapping = true;
699
-                            break;
700
-                        }
701
-                    } else {
702
-                        $model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
703
-                            $model_object_data[ $field_obj->get_name() ],
704
-                            $model_pointed_to_by_fk,
705
-                            $old_db_to_new_db_mapping,
706
-                            $export_from_site_a_to_b
707
-                        );
708
-                        $found_a_mapping = true;
709
-                    }
710
-                    // once we've found a mapping for this field no need to continue
711
-                    if ($found_a_mapping) {
712
-                        break;
713
-                    }
714
-                }
715
-            } else {
716
-                // it's a string foreign key (which we leave alone, because those are things
717
-                // like country names, which we'd really rather not make 2 USAs etc (we'd actually
718
-                // prefer to just update one)
719
-                // or it's just a regular value that ought to be replaced
720
-            }
721
-        }
722
-        //
723
-        if ($model instanceof EEM_Term_Taxonomy) {
724
-            $model_object_data = $this->_handle_split_term_ids($model_object_data);
725
-        }
726
-        return $model_object_data;
727
-    }
728
-
729
-    /**
730
-     * If the data was exported PRE-4.2, but then imported POST-4.2, then the term_id
731
-     * this term-taxonomy refers to may be out-of-date so we need to update it.
732
-     * see https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/
733
-     *
734
-     * @param type $model_object_data
735
-     * @return array new model object data
736
-     */
737
-    protected function _handle_split_term_ids($model_object_data)
738
-    {
739
-        if (isset($model_object_data['term_id'])
740
-            && isset($model_object_data['taxonomy'])
741
-            && apply_filters(
742
-                'FHEE__EE_Import__handle_split_term_ids__function_exists',
743
-                function_exists('wp_get_split_term'),
744
-                $model_object_data
745
-            )) {
746
-            $new_term_id = wp_get_split_term($model_object_data['term_id'], $model_object_data['taxonomy']);
747
-            if ($new_term_id) {
748
-                $model_object_data['term_id'] = $new_term_id;
749
-            }
750
-        }
751
-        return $model_object_data;
752
-    }
753
-
754
-    /**
755
-     * Given the object's ID and its model's name, find it int he mapping data,
756
-     * bearing in mind where it came from
757
-     *
758
-     * @param type   $object_id
759
-     * @param string $model_name
760
-     * @param array  $old_db_to_new_db_mapping
761
-     * @param type   $export_from_site_a_to_b
762
-     * @return int
763
-     */
764
-    protected function _find_mapping_in($object_id, $model_name, $old_db_to_new_db_mapping, $export_from_site_a_to_b)
765
-    {
766
-        if (isset($old_db_to_new_db_mapping[ $model_name ][ $object_id ])) {
767
-            return $old_db_to_new_db_mapping[ $model_name ][ $object_id ];
768
-        } elseif ($object_id == '0' || $object_id == '') {
769
-            // leave as-is
770
-            return $object_id;
771
-        } elseif ($export_from_site_a_to_b) {
772
-            // we couldn't find a mapping for this, and it's from a different site,
773
-            // so blank it out
774
-            return null;
775
-        } elseif (! $export_from_site_a_to_b) {
776
-            // we coudln't find a mapping for this, but it's from thsi DB anyway
777
-            // so let's just leave it as-is
778
-            return $object_id;
779
-        }
780
-    }
781
-
782
-    /**
783
-     *
784
-     * @param type     $id_in_csv
785
-     * @param type     $model_object_data
786
-     * @param EEM_Base $model
787
-     * @param type     $old_db_to_new_db_mapping
788
-     * @return array updated $old_db_to_new_db_mapping
789
-     */
790
-    protected function _insert_from_data_array($id_in_csv, $model_object_data, $model, $old_db_to_new_db_mapping)
791
-    {
792
-        // remove the primary key, if there is one (we don't want it for inserts OR updates)
793
-        // we'll put it back in if we need it
794
-        if ($model->has_primary_key_field() && $model->get_primary_key_field()->is_auto_increment()) {
795
-            $effective_id = $model_object_data[ $model->primary_key_name() ];
796
-            unset($model_object_data[ $model->primary_key_name() ]);
797
-        } else {
798
-            $effective_id = $model->get_index_primary_key_string($model_object_data);
799
-        }
800
-        // the model takes care of validating the CSV's input
801
-        try {
802
-            $new_id = $model->insert($model_object_data);
803
-            if ($new_id) {
804
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_id;
805
-                $this->_total_inserts++;
806
-                EE_Error::add_success(
807
-                    sprintf(
808
-                        __("Successfully added new %s (with id %s) with csv data %s", "event_espresso"),
809
-                        $model->get_this_model_name(),
810
-                        $new_id,
811
-                        implode(",", $model_object_data)
812
-                    )
813
-                );
814
-            } else {
815
-                $this->_total_insert_errors++;
816
-                // put the ID used back in there for the error message
817
-                if ($model->has_primary_key_field()) {
818
-                    $model_object_data[ $model->primary_key_name() ] = $effective_id;
819
-                }
820
-                EE_Error::add_error(
821
-                    sprintf(
822
-                        __("Could not insert new %s with the csv data: %s", "event_espresso"),
823
-                        $model->get_this_model_name(),
824
-                        http_build_query($model_object_data)
825
-                    ),
826
-                    __FILE__,
827
-                    __FUNCTION__,
828
-                    __LINE__
829
-                );
830
-            }
831
-        } catch (EE_Error $e) {
832
-            $this->_total_insert_errors++;
833
-            if ($model->has_primary_key_field()) {
834
-                $model_object_data[ $model->primary_key_name() ] = $effective_id;
835
-            }
836
-            EE_Error::add_error(
837
-                sprintf(
838
-                    __("Could not insert new %s with the csv data: %s because %s", "event_espresso"),
839
-                    $model->get_this_model_name(),
840
-                    implode(",", $model_object_data),
841
-                    $e->getMessage()
842
-                ),
843
-                __FILE__,
844
-                __FUNCTION__,
845
-                __LINE__
846
-            );
847
-        }
848
-        return $old_db_to_new_db_mapping;
849
-    }
850
-
851
-    /**
852
-     * Given the model object data, finds the row to update and updates it
853
-     *
854
-     * @param string|int $id_in_csv
855
-     * @param array      $model_object_data
856
-     * @param EEM_Base   $model
857
-     * @param array      $old_db_to_new_db_mapping
858
-     * @return array updated $old_db_to_new_db_mapping
859
-     */
860
-    protected function _update_from_data_array($id_in_csv, $model_object_data, $model, $old_db_to_new_db_mapping)
861
-    {
862
-        try {
863
-            // let's keep two copies of the model object data:
864
-            // one for performing an update, one for everthing else
865
-            $model_object_data_for_update = $model_object_data;
866
-            if ($model->has_primary_key_field()) {
867
-                $conditions = array($model->primary_key_name() => $model_object_data[ $model->primary_key_name() ]);
868
-                // remove the primary key because we shouldn't use it for updating
869
-                unset($model_object_data_for_update[ $model->primary_key_name() ]);
870
-            } elseif ($model->get_combined_primary_key_fields() > 1) {
871
-                $conditions = array();
872
-                foreach ($model->get_combined_primary_key_fields() as $key_field) {
873
-                    $conditions[ $key_field->get_name() ] = $model_object_data[ $key_field->get_name() ];
874
-                }
875
-            } else {
876
-                $model->primary_key_name(
877
-                );// this shoudl just throw an exception, explaining that we dont have a primary key (or a combine dkey)
878
-            }
879
-
880
-            $success = $model->update($model_object_data_for_update, array($conditions));
881
-            if ($success) {
882
-                $this->_total_updates++;
883
-                EE_Error::add_success(
884
-                    sprintf(
885
-                        __("Successfully updated %s with csv data %s", "event_espresso"),
886
-                        $model->get_this_model_name(),
887
-                        implode(",", $model_object_data_for_update)
888
-                    )
889
-                );
890
-                // we should still record the mapping even though it was an update
891
-                // because if we were going to insert somethign but it was going to conflict
892
-                // we would have last-minute decided to update. So we'd like to know what we updated
893
-                // and so we record what record ended up being updated using the mapping
894
-                if ($model->has_primary_key_field()) {
895
-                    $new_key_for_mapping = $model_object_data[ $model->primary_key_name() ];
896
-                } else {
897
-                    // no primary key just a combined key
898
-                    $new_key_for_mapping = $model->get_index_primary_key_string($model_object_data);
899
-                }
900
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_key_for_mapping;
901
-            } else {
902
-                $matched_items = $model->get_all(array($conditions));
903
-                if (! $matched_items) {
904
-                    // no items were matched (so we shouldn't have updated)... but then we should have inserted? what the heck?
905
-                    $this->_total_update_errors++;
906
-                    EE_Error::add_error(
907
-                        sprintf(
908
-                            __(
909
-                                "Could not update %s with the csv data: '%s' for an unknown reason (using WHERE conditions %s)",
910
-                                "event_espresso"
911
-                            ),
912
-                            $model->get_this_model_name(),
913
-                            http_build_query($model_object_data),
914
-                            http_build_query($conditions)
915
-                        ),
916
-                        __FILE__,
917
-                        __FUNCTION__,
918
-                        __LINE__
919
-                    );
920
-                } else {
921
-                    $this->_total_updates++;
922
-                    EE_Error::add_success(
923
-                        sprintf(
924
-                            __(
925
-                                "%s with csv data '%s' was found in the database and didn't need updating because all the data is identical.",
926
-                                "event_espresso"
927
-                            ),
928
-                            $model->get_this_model_name(),
929
-                            implode(",", $model_object_data)
930
-                        )
931
-                    );
932
-                }
933
-            }
934
-        } catch (EE_Error $e) {
935
-            $this->_total_update_errors++;
936
-            $basic_message = sprintf(
937
-                __("Could not update %s with the csv data: %s because %s", "event_espresso"),
938
-                $model->get_this_model_name(),
939
-                implode(",", $model_object_data),
940
-                $e->getMessage()
941
-            );
942
-            $debug_message = $basic_message . ' Stack trace: ' . $e->getTraceAsString();
943
-            EE_Error::add_error("$basic_message | $debug_message", __FILE__, __FUNCTION__, __LINE__);
944
-        }
945
-        return $old_db_to_new_db_mapping;
946
-    }
947
-
948
-    /**
949
-     * Gets the number of inserts performed since importer was instantiated or reset
950
-     *
951
-     * @return int
952
-     */
953
-    public function get_total_inserts()
954
-    {
955
-        return $this->_total_inserts;
956
-    }
957
-
958
-    /**
959
-     *  Gets the number of insert errors since importer was instantiated or reset
960
-     *
961
-     * @return int
962
-     */
963
-    public function get_total_insert_errors()
964
-    {
965
-        return $this->_total_insert_errors;
966
-    }
967
-
968
-    /**
969
-     *  Gets the number of updates performed since importer was instantiated or reset
970
-     *
971
-     * @return int
972
-     */
973
-    public function get_total_updates()
974
-    {
975
-        return $this->_total_updates;
976
-    }
977
-
978
-    /**
979
-     *  Gets the number of update errors since importer was instantiated or reset
980
-     *
981
-     * @return int
982
-     */
983
-    public function get_total_update_errors()
984
-    {
985
-        return $this->_total_update_errors;
986
-    }
125
+		$uploader = ob_get_clean();
126
+		return $uploader;
127
+	}
128
+
129
+
130
+	/**
131
+	 * @Import Event Espresso data - some code "borrowed" from event espresso csv_import.php
132
+	 * @access public
133
+	 * @return boolean success
134
+	 */
135
+	public function import()
136
+	{
137
+
138
+		require_once(EE_CLASSES . 'EE_CSV.class.php');
139
+		$this->EE_CSV = EE_CSV::instance();
140
+
141
+		if (isset($_REQUEST['import'])) {
142
+			if (isset($_POST['csv_submitted'])) {
143
+				switch ($_FILES['file']['error'][0]) {
144
+					case UPLOAD_ERR_OK:
145
+						$error_msg = false;
146
+						break;
147
+					case UPLOAD_ERR_INI_SIZE:
148
+						$error_msg = __(
149
+							"'The uploaded file exceeds the upload_max_filesize directive in php.ini.'",
150
+							"event_espresso"
151
+						);
152
+						break;
153
+					case UPLOAD_ERR_FORM_SIZE:
154
+						$error_msg = __(
155
+							'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
156
+							"event_espresso"
157
+						);
158
+						break;
159
+					case UPLOAD_ERR_PARTIAL:
160
+						$error_msg = __('The uploaded file was only partially uploaded.', "event_espresso");
161
+						break;
162
+					case UPLOAD_ERR_NO_FILE:
163
+						$error_msg = __('No file was uploaded.', "event_espresso");
164
+						break;
165
+					case UPLOAD_ERR_NO_TMP_DIR:
166
+						$error_msg = __('Missing a temporary folder.', "event_espresso");
167
+						break;
168
+					case UPLOAD_ERR_CANT_WRITE:
169
+						$error_msg = __('Failed to write file to disk.', "event_espresso");
170
+						break;
171
+					case UPLOAD_ERR_EXTENSION:
172
+						$error_msg = __('File upload stopped by extension.', "event_espresso");
173
+						break;
174
+					default:
175
+						$error_msg = __(
176
+							'An unknown error occurred and the file could not be uploaded',
177
+							"event_espresso"
178
+						);
179
+						break;
180
+				}
181
+
182
+				if (! $error_msg) {
183
+					$filename = $_FILES['file']['name'][0];
184
+					$file_ext = substr(strrchr($filename, '.'), 1);
185
+					$file_type = $_FILES['file']['type'][0];
186
+					$temp_file = $_FILES['file']['tmp_name'][0];
187
+					$filesize = $_FILES['file']['size'][0] / 1024;// convert from bytes to KB
188
+
189
+					if ($file_ext == 'csv') {
190
+						$max_upload = $this->EE_CSV->get_max_upload_size();// max upload size in KB
191
+						if ($filesize < $max_upload || true) {
192
+							$wp_upload_dir = str_replace(array('\\', '/'), '/', wp_upload_dir());
193
+							$path_to_file = $wp_upload_dir['basedir'] . '/espresso/' . $filename;
194
+
195
+							if (move_uploaded_file($temp_file, $path_to_file)) {
196
+								// convert csv to array
197
+								$this->csv_array = $this->EE_CSV->import_csv_to_model_data_array($path_to_file);
198
+
199
+								// was data successfully stored in an array?
200
+								if (is_array($this->csv_array)) {
201
+									$import_what = str_replace('csv_import_', '', $_REQUEST['action']);
202
+									$import_what = str_replace('_', ' ', ucwords($import_what));
203
+									$processed_data = $this->csv_array;
204
+									$this->columns_to_save = false;
205
+
206
+									// if any imports require funcky processing, we'll catch them in the switch
207
+									switch ($_REQUEST['action']) {
208
+										case "import_events":
209
+										case "event_list":
210
+											$import_what = 'Event Details';
211
+											break;
212
+
213
+										case 'groupon_import_csv':
214
+											$import_what = 'Groupon Codes';
215
+											$processed_data = $this->process_groupon_codes();
216
+											break;
217
+									}
218
+									// save processed codes to db
219
+									if ($this->save_csv_data_array_to_db($processed_data, $this->columns_to_save)) {
220
+										return true;
221
+									}
222
+								} else {
223
+									// no array? must be an error
224
+									EE_Error::add_error(
225
+										sprintf(__("No file seems to have been uploaded", "event_espresso")),
226
+										__FILE__,
227
+										__FUNCTION__,
228
+										__LINE__
229
+									);
230
+									return false;
231
+								}
232
+							} else {
233
+								EE_Error::add_error(
234
+									sprintf(__("%s was not successfully uploaded", "event_espresso"), $filename),
235
+									__FILE__,
236
+									__FUNCTION__,
237
+									__LINE__
238
+								);
239
+								return false;
240
+							}
241
+						} else {
242
+							EE_Error::add_error(
243
+								sprintf(
244
+									__(
245
+										"%s was too large of a file and could not be uploaded. The max filesize is %s' KB.",
246
+										"event_espresso"
247
+									),
248
+									$filename,
249
+									$max_upload
250
+								),
251
+								__FILE__,
252
+								__FUNCTION__,
253
+								__LINE__
254
+							);
255
+							return false;
256
+						}
257
+					} else {
258
+						EE_Error::add_error(
259
+							sprintf(__("%s  had an invalid file extension, not uploaded", "event_espresso"), $filename),
260
+							__FILE__,
261
+							__FUNCTION__,
262
+							__LINE__
263
+						);
264
+						return false;
265
+					}
266
+				} else {
267
+					EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
268
+					return false;
269
+				}
270
+			}
271
+		}
272
+		return;
273
+	}
274
+
275
+
276
+	/**
277
+	 *    Given an array of data (usually from a CSV import) attempts to save that data to the db.
278
+	 *    If $model_name ISN'T provided, assumes that this is a 3d array, with toplevel keys being model names,
279
+	 *    next level being numeric indexes adn each value representing a model object, and the last layer down
280
+	 *    being keys of model fields and their proposed values.
281
+	 *    If $model_name IS provided, assumes a 2d array of the bottom two layers previously mentioned.
282
+	 *    If the CSV data says (in the metadata row) that it's from the SAME database,
283
+	 *    we treat the IDs in the CSV as the normal IDs, and try to update those records. However, if those
284
+	 *    IDs DON'T exist in the database, they're treated as temporary IDs,
285
+	 *    which can used elsewhere to refer to the same object. Once an item
286
+	 *    with a temporary ID gets inserted, we record its mapping from temporary
287
+	 *    ID to real ID, and use the real ID in place of the temporary ID
288
+	 *    when that temporary ID was used as a foreign key.
289
+	 *    If the CSV data says (in the metadata again) that it's from a DIFFERENT database,
290
+	 *    we treat all the IDs in the CSV as temporary ID- eg, if the CSV specifies an event with
291
+	 *    ID 1, and the database already has an event with ID 1, we assume that's just a coincidence,
292
+	 *    and insert a new event, and map it's temporary ID of 1 over to its new real ID.
293
+	 *    An important exception are non-auto-increment primary keys. If one entry in the
294
+	 *    CSV file has the same ID as one in the DB, we assume they are meant to be
295
+	 *    the same item, and instead update the item in the DB with that same ID.
296
+	 *    Also note, we remember the mappings permanently. So the 2nd, 3rd, and 10000th
297
+	 *    time you import a CSV from a different site, we remember their mappings, and
298
+	 * will try to update the item in the DB instead of inserting another item (eg
299
+	 * if we previously imported an event with temporary ID 1, and then it got a
300
+	 * real ID of 123, we remember that. So the next time we import an event with
301
+	 * temporary ID, from the same site, we know that it's real ID is 123, and will
302
+	 * update that event, instead of adding a new event).
303
+	 *
304
+	 * @access public
305
+	 * @param array $csv_data_array - the array containing the csv data produced from
306
+	 *                              EE_CSV::import_csv_to_model_data_array()
307
+	 * @param array $fields_to_save - an array containing the csv column names as keys with the corresponding db table
308
+	 *                              fields they will be saved to
309
+	 * @return TRUE on success, FALSE on fail
310
+	 * @throws \EE_Error
311
+	 */
312
+	public function save_csv_data_array_to_db($csv_data_array, $model_name = false)
313
+	{
314
+		$success = false;
315
+		$error = false;
316
+		// whther to treat this import as if it's data froma different database or not
317
+		// ie, if it IS from a different database, ignore foreign keys whihf
318
+		$export_from_site_a_to_b = true;
319
+		// first level of array is not table information but a table name was passed to the function
320
+		// array is only two levels deep, so let's fix that by adding a level, else the next steps will fail
321
+		if ($model_name) {
322
+			$csv_data_array = array($csv_data_array);
323
+		}
324
+		// begin looking through the $csv_data_array, expecting the toplevel key to be the model's name...
325
+		$old_site_url = 'none-specified';
326
+		// hanlde metadata
327
+		if (isset($csv_data_array[ EE_CSV::metadata_header ])) {
328
+			$csv_metadata = array_shift($csv_data_array[ EE_CSV::metadata_header ]);
329
+			// ok so its metadata, dont try to save it to ehte db obviously...
330
+			if (isset($csv_metadata['site_url']) && $csv_metadata['site_url'] == site_url()) {
331
+				EE_Error::add_attention(
332
+					sprintf(
333
+						__(
334
+							"CSV Data appears to be from the same database, so attempting to update data",
335
+							"event_espresso"
336
+						)
337
+					)
338
+				);
339
+				$export_from_site_a_to_b = false;
340
+			} else {
341
+				$old_site_url = isset($csv_metadata['site_url']) ? $csv_metadata['site_url'] : $old_site_url;
342
+				EE_Error::add_attention(
343
+					sprintf(
344
+						__(
345
+							"CSV Data appears to be from a different database (%s instead of %s), so we assume IDs in the CSV data DO NOT correspond to IDs in this database",
346
+							"event_espresso"
347
+						),
348
+						$old_site_url,
349
+						site_url()
350
+					)
351
+				);
352
+			};
353
+			unset($csv_data_array[ EE_CSV::metadata_header ]);
354
+		}
355
+		/**
356
+		 * @var $old_db_to_new_db_mapping 2d array: toplevel keys being model names, bottom-level keys being the original key, and
357
+		 * the value will be the newly-inserted ID.
358
+		 * If we have already imported data from the same website via CSV, it shoudl be kept in this wp option
359
+		 */
360
+		$old_db_to_new_db_mapping = get_option('ee_id_mapping_from' . sanitize_title($old_site_url), array());
361
+		if ($old_db_to_new_db_mapping) {
362
+			EE_Error::add_attention(
363
+				sprintf(
364
+					__(
365
+						"We noticed you have imported data via CSV from %s before. Because of this, IDs in your CSV have been mapped to their new IDs in %s",
366
+						"event_espresso"
367
+					),
368
+					$old_site_url,
369
+					site_url()
370
+				)
371
+			);
372
+		}
373
+		$old_db_to_new_db_mapping = $this->save_data_rows_to_db(
374
+			$csv_data_array,
375
+			$export_from_site_a_to_b,
376
+			$old_db_to_new_db_mapping
377
+		);
378
+
379
+		// save the mapping from old db to new db in case they try re-importing the same data from the same website again
380
+		update_option('ee_id_mapping_from' . sanitize_title($old_site_url), $old_db_to_new_db_mapping);
381
+
382
+		if ($this->_total_updates > 0) {
383
+			EE_Error::add_success(
384
+				sprintf(
385
+					__("%s existing records in the database were updated.", "event_espresso"),
386
+					$this->_total_updates
387
+				)
388
+			);
389
+			$success = true;
390
+		}
391
+		if ($this->_total_inserts > 0) {
392
+			EE_Error::add_success(
393
+				sprintf(__("%s new records were added to the database.", "event_espresso"), $this->_total_inserts)
394
+			);
395
+			$success = true;
396
+		}
397
+
398
+		if ($this->_total_update_errors > 0) {
399
+			EE_Error::add_error(
400
+				sprintf(
401
+					__(
402
+						"'One or more errors occurred, and a total of %s existing records in the database were <strong>not</strong> updated.'",
403
+						"event_espresso"
404
+					),
405
+					$this->_total_update_errors
406
+				),
407
+				__FILE__,
408
+				__FUNCTION__,
409
+				__LINE__
410
+			);
411
+			$error = true;
412
+		}
413
+		if ($this->_total_insert_errors > 0) {
414
+			EE_Error::add_error(
415
+				sprintf(
416
+					__(
417
+						"One or more errors occurred, and a total of %s new records were <strong>not</strong> added to the database.'",
418
+						"event_espresso"
419
+					),
420
+					$this->_total_insert_errors
421
+				),
422
+				__FILE__,
423
+				__FUNCTION__,
424
+				__LINE__
425
+			);
426
+			$error = true;
427
+		}
428
+
429
+		// lastly, we need to update the datetime and ticket sold amounts
430
+		// as those may have been affected by this
431
+		EEM_Ticket::instance()->update_tickets_sold(EEM_Ticket::instance()->get_all());
432
+
433
+		// if there was at least one success and absolutely no errors
434
+		if ($success && ! $error) {
435
+			return true;
436
+		} else {
437
+			return false;
438
+		}
439
+	}
440
+
441
+
442
+	/**
443
+	 * Processes the array of data, given the knowledge that it's from the same database or a different one,
444
+	 * and the mapping from temporary IDs to real IDs.
445
+	 * If the data is from a different database, we treat the primary keys and their corresponding
446
+	 * foreign keys as "temp Ids", basically identifiers that get mapped to real primary keys
447
+	 * in the real target database. As items are inserted, their temporary primary keys
448
+	 * are mapped to the real IDs in the target database. Also, before doing any update or
449
+	 * insert, we replace all the temp ID which are foreign keys with their mapped real IDs.
450
+	 * An exception: string primary keys are treated as real IDs, or else we'd need to
451
+	 * dynamically generate new string primary keys which would be very awkard for the country table etc.
452
+	 * Also, models with no primary key are strange too. We combine use their primar key INDEX (a
453
+	 * combination of fields) to create a unique string identifying the row and store
454
+	 * those in the mapping.
455
+	 *
456
+	 * If the data is from the same database, we usually treat primary keys as real IDs.
457
+	 * An exception is if there is nothing in the database for that ID. If that's the case,
458
+	 * we need to insert a new row for that ID, and then map from the non-existent ID
459
+	 * to the newly-inserted real ID.
460
+	 *
461
+	 * @param type $csv_data_array
462
+	 * @param type $export_from_site_a_to_b
463
+	 * @param type $old_db_to_new_db_mapping
464
+	 * @return array updated $old_db_to_new_db_mapping
465
+	 */
466
+	public function save_data_rows_to_db($csv_data_array, $export_from_site_a_to_b, $old_db_to_new_db_mapping)
467
+	{
468
+		foreach ($csv_data_array as $model_name_in_csv_data => $model_data_from_import) {
469
+			// now check that assumption was correct. If
470
+			if (EE_Registry::instance()->is_model_name($model_name_in_csv_data)) {
471
+				$model_name = $model_name_in_csv_data;
472
+			} else {
473
+				// no table info in the array and no table name passed to the function?? FAIL
474
+				EE_Error::add_error(
475
+					__(
476
+						'No table information was specified and/or found, therefore the import could not be completed',
477
+						'event_espresso'
478
+					),
479
+					__FILE__,
480
+					__FUNCTION__,
481
+					__LINE__
482
+				);
483
+				return false;
484
+			}
485
+			/* @var $model EEM_Base */
486
+			$model = EE_Registry::instance()->load_model($model_name);
487
+
488
+			// so without further ado, scanning all the data provided for primary keys and their inital values
489
+			foreach ($model_data_from_import as $model_object_data) {
490
+				// before we do ANYTHING, make sure the csv row wasn't just completely blank
491
+				$row_is_completely_empty = true;
492
+				foreach ($model_object_data as $field) {
493
+					if ($field) {
494
+						$row_is_completely_empty = false;
495
+					}
496
+				}
497
+				if ($row_is_completely_empty) {
498
+					continue;
499
+				}
500
+				// find the PK in the row of data (or a combined key if
501
+				// there is no primary key)
502
+				if ($model->has_primary_key_field()) {
503
+					$id_in_csv = $model_object_data[ $model->primary_key_name() ];
504
+				} else {
505
+					$id_in_csv = $model->get_index_primary_key_string($model_object_data);
506
+				}
507
+
508
+
509
+				$model_object_data = $this->_replace_temp_ids_with_mappings(
510
+					$model_object_data,
511
+					$model,
512
+					$old_db_to_new_db_mapping,
513
+					$export_from_site_a_to_b
514
+				);
515
+				// now we need to decide if we're going to add a new model object given the $model_object_data,
516
+				// or just update.
517
+				if ($export_from_site_a_to_b) {
518
+					$what_to_do = $this->_decide_whether_to_insert_or_update_given_data_from_other_db(
519
+						$id_in_csv,
520
+						$model_object_data,
521
+						$model,
522
+						$old_db_to_new_db_mapping
523
+					);
524
+				} else {// this is just a re-import
525
+					$what_to_do = $this->_decide_whether_to_insert_or_update_given_data_from_same_db(
526
+						$id_in_csv,
527
+						$model_object_data,
528
+						$model,
529
+						$old_db_to_new_db_mapping
530
+					);
531
+				}
532
+				if ($what_to_do == self::do_nothing) {
533
+					continue;
534
+				}
535
+
536
+				// double-check we actually want to insert, if that's what we're planning
537
+				// based on whether this item would be unique in the DB or not
538
+				if ($what_to_do == self::do_insert) {
539
+					// we're supposed to be inserting. But wait, will this thing
540
+					// be acceptable if inserted?
541
+					$conflicting = $model->get_one_conflicting($model_object_data, false);
542
+					if ($conflicting) {
543
+						// ok, this item would conflict if inserted. Just update the item that it conflicts with.
544
+						$what_to_do = self::do_update;
545
+						// and if this model has a primary key, remember its mapping
546
+						if ($model->has_primary_key_field()) {
547
+							$old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ] = $conflicting->ID();
548
+							$model_object_data[ $model->primary_key_name() ] = $conflicting->ID();
549
+						} else {
550
+							// we want to update this conflicting item, instead of inserting a conflicting item
551
+							// so we need to make sure they match entirely (its possible that they only conflicted on one field, but we need them to match on other fields
552
+							// for the WHERE conditions in the update). At the time of this comment, there were no models like this
553
+							foreach ($model->get_combined_primary_key_fields() as $key_field) {
554
+								$model_object_data[ $key_field->get_name() ] = $conflicting->get(
555
+									$key_field->get_name()
556
+								);
557
+							}
558
+						}
559
+					}
560
+				}
561
+				if ($what_to_do == self::do_insert) {
562
+					$old_db_to_new_db_mapping = $this->_insert_from_data_array(
563
+						$id_in_csv,
564
+						$model_object_data,
565
+						$model,
566
+						$old_db_to_new_db_mapping
567
+					);
568
+				} elseif ($what_to_do == self::do_update) {
569
+					$old_db_to_new_db_mapping = $this->_update_from_data_array(
570
+						$id_in_csv,
571
+						$model_object_data,
572
+						$model,
573
+						$old_db_to_new_db_mapping
574
+					);
575
+				} else {
576
+					throw new EE_Error(
577
+						sprintf(
578
+							__(
579
+								'Programming error. We shoudl be inserting or updating, but instead we are being told to "%s", whifh is invalid',
580
+								'event_espresso'
581
+							),
582
+							$what_to_do
583
+						)
584
+					);
585
+				}
586
+			}
587
+		}
588
+		return $old_db_to_new_db_mapping;
589
+	}
590
+
591
+
592
+	/**
593
+	 * Decides whether or not to insert, given that this data is from another database.
594
+	 * So, if the primary key of this $model_object_data already exists in the database,
595
+	 * it's just a coincidence and we should still insert. The only time we should
596
+	 * update is when we know what it maps to, or there's something that would
597
+	 * conflict (and we should instead just update that conflicting thing)
598
+	 *
599
+	 * @param string   $id_in_csv
600
+	 * @param array    $model_object_data        by reference so it can be modified
601
+	 * @param EEM_Base $model
602
+	 * @param array    $old_db_to_new_db_mapping by reference so it can be modified
603
+	 * @return string one of the consts on this class that starts with do_*
604
+	 */
605
+	protected function _decide_whether_to_insert_or_update_given_data_from_other_db(
606
+		$id_in_csv,
607
+		$model_object_data,
608
+		$model,
609
+		$old_db_to_new_db_mapping
610
+	) {
611
+		$model_name = $model->get_this_model_name();
612
+		// if it's a site-to-site export-and-import, see if this modelobject's id
613
+		// in the old data that we know of
614
+		if (isset($old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ])) {
615
+			return self::do_update;
616
+		} else {
617
+			return self::do_insert;
618
+		}
619
+	}
620
+
621
+	/**
622
+	 * If this thing basically already exists in the database, we want to update it;
623
+	 * otherwise insert it (ie, someone tweaked the CSV file, or the item was
624
+	 * deleted in the database so it should be re-inserted)
625
+	 *
626
+	 * @param type     $id_in_csv
627
+	 * @param type     $model_object_data
628
+	 * @param EEM_Base $model
629
+	 * @param type     $old_db_to_new_db_mapping
630
+	 * @return
631
+	 */
632
+	protected function _decide_whether_to_insert_or_update_given_data_from_same_db(
633
+		$id_in_csv,
634
+		$model_object_data,
635
+		$model
636
+	) {
637
+		// in this case, check if this thing ACTUALLY exists in the database
638
+		if ($model->get_one_conflicting($model_object_data)) {
639
+			return self::do_update;
640
+		} else {
641
+			return self::do_insert;
642
+		}
643
+	}
644
+
645
+	/**
646
+	 * Using the $old_db_to_new_db_mapping array, replaces all the temporary IDs
647
+	 * with their mapped real IDs. Eg, if importing from site A to B, the mapping
648
+	 * file may indicate that the ID "my_event_id" maps to an actual event ID of 123.
649
+	 * So this function searches for any event temp Ids called "my_event_id" and
650
+	 * replaces them with 123.
651
+	 * Also, if there is no temp ID for the INT foreign keys from another database,
652
+	 * replaces them with 0 or the field's default.
653
+	 *
654
+	 * @param type     $model_object_data
655
+	 * @param EEM_Base $model
656
+	 * @param type     $old_db_to_new_db_mapping
657
+	 * @param boolean  $export_from_site_a_to_b
658
+	 * @return array updated model object data with temp IDs removed
659
+	 */
660
+	protected function _replace_temp_ids_with_mappings(
661
+		$model_object_data,
662
+		$model,
663
+		$old_db_to_new_db_mapping,
664
+		$export_from_site_a_to_b
665
+	) {
666
+		// if this model object's primary key is in the mapping, replace it
667
+		if ($model->has_primary_key_field() &&
668
+			$model->get_primary_key_field()->is_auto_increment() &&
669
+			isset($old_db_to_new_db_mapping[ $model->get_this_model_name() ]) &&
670
+			isset(
671
+				$old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $model_object_data[ $model->primary_key_name() ] ]
672
+			)) {
673
+			$model_object_data[ $model->primary_key_name() ] = $old_db_to_new_db_mapping[ $model->get_this_model_name(
674
+			) ][ $model_object_data[ $model->primary_key_name() ] ];
675
+		}
676
+
677
+		try {
678
+			$model_name_field = $model->get_field_containing_related_model_name();
679
+			$models_pointed_to_by_model_name_field = $model_name_field->get_model_names_pointed_to();
680
+		} catch (EE_Error $e) {
681
+			$model_name_field = null;
682
+			$models_pointed_to_by_model_name_field = array();
683
+		}
684
+		foreach ($model->field_settings(true) as $field_obj) {
685
+			if ($field_obj instanceof EE_Foreign_Key_Int_Field) {
686
+				$models_pointed_to = $field_obj->get_model_names_pointed_to();
687
+				$found_a_mapping = false;
688
+				foreach ($models_pointed_to as $model_pointed_to_by_fk) {
689
+					if ($model_name_field) {
690
+						$value_of_model_name_field = $model_object_data[ $model_name_field->get_name() ];
691
+						if ($value_of_model_name_field == $model_pointed_to_by_fk) {
692
+							$model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
693
+								$model_object_data[ $field_obj->get_name() ],
694
+								$model_pointed_to_by_fk,
695
+								$old_db_to_new_db_mapping,
696
+								$export_from_site_a_to_b
697
+							);
698
+							$found_a_mapping = true;
699
+							break;
700
+						}
701
+					} else {
702
+						$model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
703
+							$model_object_data[ $field_obj->get_name() ],
704
+							$model_pointed_to_by_fk,
705
+							$old_db_to_new_db_mapping,
706
+							$export_from_site_a_to_b
707
+						);
708
+						$found_a_mapping = true;
709
+					}
710
+					// once we've found a mapping for this field no need to continue
711
+					if ($found_a_mapping) {
712
+						break;
713
+					}
714
+				}
715
+			} else {
716
+				// it's a string foreign key (which we leave alone, because those are things
717
+				// like country names, which we'd really rather not make 2 USAs etc (we'd actually
718
+				// prefer to just update one)
719
+				// or it's just a regular value that ought to be replaced
720
+			}
721
+		}
722
+		//
723
+		if ($model instanceof EEM_Term_Taxonomy) {
724
+			$model_object_data = $this->_handle_split_term_ids($model_object_data);
725
+		}
726
+		return $model_object_data;
727
+	}
728
+
729
+	/**
730
+	 * If the data was exported PRE-4.2, but then imported POST-4.2, then the term_id
731
+	 * this term-taxonomy refers to may be out-of-date so we need to update it.
732
+	 * see https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/
733
+	 *
734
+	 * @param type $model_object_data
735
+	 * @return array new model object data
736
+	 */
737
+	protected function _handle_split_term_ids($model_object_data)
738
+	{
739
+		if (isset($model_object_data['term_id'])
740
+			&& isset($model_object_data['taxonomy'])
741
+			&& apply_filters(
742
+				'FHEE__EE_Import__handle_split_term_ids__function_exists',
743
+				function_exists('wp_get_split_term'),
744
+				$model_object_data
745
+			)) {
746
+			$new_term_id = wp_get_split_term($model_object_data['term_id'], $model_object_data['taxonomy']);
747
+			if ($new_term_id) {
748
+				$model_object_data['term_id'] = $new_term_id;
749
+			}
750
+		}
751
+		return $model_object_data;
752
+	}
753
+
754
+	/**
755
+	 * Given the object's ID and its model's name, find it int he mapping data,
756
+	 * bearing in mind where it came from
757
+	 *
758
+	 * @param type   $object_id
759
+	 * @param string $model_name
760
+	 * @param array  $old_db_to_new_db_mapping
761
+	 * @param type   $export_from_site_a_to_b
762
+	 * @return int
763
+	 */
764
+	protected function _find_mapping_in($object_id, $model_name, $old_db_to_new_db_mapping, $export_from_site_a_to_b)
765
+	{
766
+		if (isset($old_db_to_new_db_mapping[ $model_name ][ $object_id ])) {
767
+			return $old_db_to_new_db_mapping[ $model_name ][ $object_id ];
768
+		} elseif ($object_id == '0' || $object_id == '') {
769
+			// leave as-is
770
+			return $object_id;
771
+		} elseif ($export_from_site_a_to_b) {
772
+			// we couldn't find a mapping for this, and it's from a different site,
773
+			// so blank it out
774
+			return null;
775
+		} elseif (! $export_from_site_a_to_b) {
776
+			// we coudln't find a mapping for this, but it's from thsi DB anyway
777
+			// so let's just leave it as-is
778
+			return $object_id;
779
+		}
780
+	}
781
+
782
+	/**
783
+	 *
784
+	 * @param type     $id_in_csv
785
+	 * @param type     $model_object_data
786
+	 * @param EEM_Base $model
787
+	 * @param type     $old_db_to_new_db_mapping
788
+	 * @return array updated $old_db_to_new_db_mapping
789
+	 */
790
+	protected function _insert_from_data_array($id_in_csv, $model_object_data, $model, $old_db_to_new_db_mapping)
791
+	{
792
+		// remove the primary key, if there is one (we don't want it for inserts OR updates)
793
+		// we'll put it back in if we need it
794
+		if ($model->has_primary_key_field() && $model->get_primary_key_field()->is_auto_increment()) {
795
+			$effective_id = $model_object_data[ $model->primary_key_name() ];
796
+			unset($model_object_data[ $model->primary_key_name() ]);
797
+		} else {
798
+			$effective_id = $model->get_index_primary_key_string($model_object_data);
799
+		}
800
+		// the model takes care of validating the CSV's input
801
+		try {
802
+			$new_id = $model->insert($model_object_data);
803
+			if ($new_id) {
804
+				$old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_id;
805
+				$this->_total_inserts++;
806
+				EE_Error::add_success(
807
+					sprintf(
808
+						__("Successfully added new %s (with id %s) with csv data %s", "event_espresso"),
809
+						$model->get_this_model_name(),
810
+						$new_id,
811
+						implode(",", $model_object_data)
812
+					)
813
+				);
814
+			} else {
815
+				$this->_total_insert_errors++;
816
+				// put the ID used back in there for the error message
817
+				if ($model->has_primary_key_field()) {
818
+					$model_object_data[ $model->primary_key_name() ] = $effective_id;
819
+				}
820
+				EE_Error::add_error(
821
+					sprintf(
822
+						__("Could not insert new %s with the csv data: %s", "event_espresso"),
823
+						$model->get_this_model_name(),
824
+						http_build_query($model_object_data)
825
+					),
826
+					__FILE__,
827
+					__FUNCTION__,
828
+					__LINE__
829
+				);
830
+			}
831
+		} catch (EE_Error $e) {
832
+			$this->_total_insert_errors++;
833
+			if ($model->has_primary_key_field()) {
834
+				$model_object_data[ $model->primary_key_name() ] = $effective_id;
835
+			}
836
+			EE_Error::add_error(
837
+				sprintf(
838
+					__("Could not insert new %s with the csv data: %s because %s", "event_espresso"),
839
+					$model->get_this_model_name(),
840
+					implode(",", $model_object_data),
841
+					$e->getMessage()
842
+				),
843
+				__FILE__,
844
+				__FUNCTION__,
845
+				__LINE__
846
+			);
847
+		}
848
+		return $old_db_to_new_db_mapping;
849
+	}
850
+
851
+	/**
852
+	 * Given the model object data, finds the row to update and updates it
853
+	 *
854
+	 * @param string|int $id_in_csv
855
+	 * @param array      $model_object_data
856
+	 * @param EEM_Base   $model
857
+	 * @param array      $old_db_to_new_db_mapping
858
+	 * @return array updated $old_db_to_new_db_mapping
859
+	 */
860
+	protected function _update_from_data_array($id_in_csv, $model_object_data, $model, $old_db_to_new_db_mapping)
861
+	{
862
+		try {
863
+			// let's keep two copies of the model object data:
864
+			// one for performing an update, one for everthing else
865
+			$model_object_data_for_update = $model_object_data;
866
+			if ($model->has_primary_key_field()) {
867
+				$conditions = array($model->primary_key_name() => $model_object_data[ $model->primary_key_name() ]);
868
+				// remove the primary key because we shouldn't use it for updating
869
+				unset($model_object_data_for_update[ $model->primary_key_name() ]);
870
+			} elseif ($model->get_combined_primary_key_fields() > 1) {
871
+				$conditions = array();
872
+				foreach ($model->get_combined_primary_key_fields() as $key_field) {
873
+					$conditions[ $key_field->get_name() ] = $model_object_data[ $key_field->get_name() ];
874
+				}
875
+			} else {
876
+				$model->primary_key_name(
877
+				);// this shoudl just throw an exception, explaining that we dont have a primary key (or a combine dkey)
878
+			}
879
+
880
+			$success = $model->update($model_object_data_for_update, array($conditions));
881
+			if ($success) {
882
+				$this->_total_updates++;
883
+				EE_Error::add_success(
884
+					sprintf(
885
+						__("Successfully updated %s with csv data %s", "event_espresso"),
886
+						$model->get_this_model_name(),
887
+						implode(",", $model_object_data_for_update)
888
+					)
889
+				);
890
+				// we should still record the mapping even though it was an update
891
+				// because if we were going to insert somethign but it was going to conflict
892
+				// we would have last-minute decided to update. So we'd like to know what we updated
893
+				// and so we record what record ended up being updated using the mapping
894
+				if ($model->has_primary_key_field()) {
895
+					$new_key_for_mapping = $model_object_data[ $model->primary_key_name() ];
896
+				} else {
897
+					// no primary key just a combined key
898
+					$new_key_for_mapping = $model->get_index_primary_key_string($model_object_data);
899
+				}
900
+				$old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_key_for_mapping;
901
+			} else {
902
+				$matched_items = $model->get_all(array($conditions));
903
+				if (! $matched_items) {
904
+					// no items were matched (so we shouldn't have updated)... but then we should have inserted? what the heck?
905
+					$this->_total_update_errors++;
906
+					EE_Error::add_error(
907
+						sprintf(
908
+							__(
909
+								"Could not update %s with the csv data: '%s' for an unknown reason (using WHERE conditions %s)",
910
+								"event_espresso"
911
+							),
912
+							$model->get_this_model_name(),
913
+							http_build_query($model_object_data),
914
+							http_build_query($conditions)
915
+						),
916
+						__FILE__,
917
+						__FUNCTION__,
918
+						__LINE__
919
+					);
920
+				} else {
921
+					$this->_total_updates++;
922
+					EE_Error::add_success(
923
+						sprintf(
924
+							__(
925
+								"%s with csv data '%s' was found in the database and didn't need updating because all the data is identical.",
926
+								"event_espresso"
927
+							),
928
+							$model->get_this_model_name(),
929
+							implode(",", $model_object_data)
930
+						)
931
+					);
932
+				}
933
+			}
934
+		} catch (EE_Error $e) {
935
+			$this->_total_update_errors++;
936
+			$basic_message = sprintf(
937
+				__("Could not update %s with the csv data: %s because %s", "event_espresso"),
938
+				$model->get_this_model_name(),
939
+				implode(",", $model_object_data),
940
+				$e->getMessage()
941
+			);
942
+			$debug_message = $basic_message . ' Stack trace: ' . $e->getTraceAsString();
943
+			EE_Error::add_error("$basic_message | $debug_message", __FILE__, __FUNCTION__, __LINE__);
944
+		}
945
+		return $old_db_to_new_db_mapping;
946
+	}
947
+
948
+	/**
949
+	 * Gets the number of inserts performed since importer was instantiated or reset
950
+	 *
951
+	 * @return int
952
+	 */
953
+	public function get_total_inserts()
954
+	{
955
+		return $this->_total_inserts;
956
+	}
957
+
958
+	/**
959
+	 *  Gets the number of insert errors since importer was instantiated or reset
960
+	 *
961
+	 * @return int
962
+	 */
963
+	public function get_total_insert_errors()
964
+	{
965
+		return $this->_total_insert_errors;
966
+	}
967
+
968
+	/**
969
+	 *  Gets the number of updates performed since importer was instantiated or reset
970
+	 *
971
+	 * @return int
972
+	 */
973
+	public function get_total_updates()
974
+	{
975
+		return $this->_total_updates;
976
+	}
977
+
978
+	/**
979
+	 *  Gets the number of update errors since importer was instantiated or reset
980
+	 *
981
+	 * @return int
982
+	 */
983
+	public function get_total_update_errors()
984
+	{
985
+		return $this->_total_update_errors;
986
+	}
987 987
 }
Please login to merge, or discard this patch.
Spacing   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -135,7 +135,7 @@  discard block
 block discarded – undo
135 135
     public function import()
136 136
     {
137 137
 
138
-        require_once(EE_CLASSES . 'EE_CSV.class.php');
138
+        require_once(EE_CLASSES.'EE_CSV.class.php');
139 139
         $this->EE_CSV = EE_CSV::instance();
140 140
 
141 141
         if (isset($_REQUEST['import'])) {
@@ -179,18 +179,18 @@  discard block
 block discarded – undo
179 179
                         break;
180 180
                 }
181 181
 
182
-                if (! $error_msg) {
182
+                if ( ! $error_msg) {
183 183
                     $filename = $_FILES['file']['name'][0];
184 184
                     $file_ext = substr(strrchr($filename, '.'), 1);
185 185
                     $file_type = $_FILES['file']['type'][0];
186 186
                     $temp_file = $_FILES['file']['tmp_name'][0];
187
-                    $filesize = $_FILES['file']['size'][0] / 1024;// convert from bytes to KB
187
+                    $filesize = $_FILES['file']['size'][0] / 1024; // convert from bytes to KB
188 188
 
189 189
                     if ($file_ext == 'csv') {
190
-                        $max_upload = $this->EE_CSV->get_max_upload_size();// max upload size in KB
190
+                        $max_upload = $this->EE_CSV->get_max_upload_size(); // max upload size in KB
191 191
                         if ($filesize < $max_upload || true) {
192 192
                             $wp_upload_dir = str_replace(array('\\', '/'), '/', wp_upload_dir());
193
-                            $path_to_file = $wp_upload_dir['basedir'] . '/espresso/' . $filename;
193
+                            $path_to_file = $wp_upload_dir['basedir'].'/espresso/'.$filename;
194 194
 
195 195
                             if (move_uploaded_file($temp_file, $path_to_file)) {
196 196
                                 // convert csv to array
@@ -324,8 +324,8 @@  discard block
 block discarded – undo
324 324
         // begin looking through the $csv_data_array, expecting the toplevel key to be the model's name...
325 325
         $old_site_url = 'none-specified';
326 326
         // hanlde metadata
327
-        if (isset($csv_data_array[ EE_CSV::metadata_header ])) {
328
-            $csv_metadata = array_shift($csv_data_array[ EE_CSV::metadata_header ]);
327
+        if (isset($csv_data_array[EE_CSV::metadata_header])) {
328
+            $csv_metadata = array_shift($csv_data_array[EE_CSV::metadata_header]);
329 329
             // ok so its metadata, dont try to save it to ehte db obviously...
330 330
             if (isset($csv_metadata['site_url']) && $csv_metadata['site_url'] == site_url()) {
331 331
                 EE_Error::add_attention(
@@ -350,14 +350,14 @@  discard block
 block discarded – undo
350 350
                     )
351 351
                 );
352 352
             };
353
-            unset($csv_data_array[ EE_CSV::metadata_header ]);
353
+            unset($csv_data_array[EE_CSV::metadata_header]);
354 354
         }
355 355
         /**
356 356
          * @var $old_db_to_new_db_mapping 2d array: toplevel keys being model names, bottom-level keys being the original key, and
357 357
          * the value will be the newly-inserted ID.
358 358
          * If we have already imported data from the same website via CSV, it shoudl be kept in this wp option
359 359
          */
360
-        $old_db_to_new_db_mapping = get_option('ee_id_mapping_from' . sanitize_title($old_site_url), array());
360
+        $old_db_to_new_db_mapping = get_option('ee_id_mapping_from'.sanitize_title($old_site_url), array());
361 361
         if ($old_db_to_new_db_mapping) {
362 362
             EE_Error::add_attention(
363 363
                 sprintf(
@@ -377,7 +377,7 @@  discard block
 block discarded – undo
377 377
         );
378 378
 
379 379
         // save the mapping from old db to new db in case they try re-importing the same data from the same website again
380
-        update_option('ee_id_mapping_from' . sanitize_title($old_site_url), $old_db_to_new_db_mapping);
380
+        update_option('ee_id_mapping_from'.sanitize_title($old_site_url), $old_db_to_new_db_mapping);
381 381
 
382 382
         if ($this->_total_updates > 0) {
383 383
             EE_Error::add_success(
@@ -500,7 +500,7 @@  discard block
 block discarded – undo
500 500
                 // find the PK in the row of data (or a combined key if
501 501
                 // there is no primary key)
502 502
                 if ($model->has_primary_key_field()) {
503
-                    $id_in_csv = $model_object_data[ $model->primary_key_name() ];
503
+                    $id_in_csv = $model_object_data[$model->primary_key_name()];
504 504
                 } else {
505 505
                     $id_in_csv = $model->get_index_primary_key_string($model_object_data);
506 506
                 }
@@ -544,14 +544,14 @@  discard block
 block discarded – undo
544 544
                         $what_to_do = self::do_update;
545 545
                         // and if this model has a primary key, remember its mapping
546 546
                         if ($model->has_primary_key_field()) {
547
-                            $old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ] = $conflicting->ID();
548
-                            $model_object_data[ $model->primary_key_name() ] = $conflicting->ID();
547
+                            $old_db_to_new_db_mapping[$model_name][$id_in_csv] = $conflicting->ID();
548
+                            $model_object_data[$model->primary_key_name()] = $conflicting->ID();
549 549
                         } else {
550 550
                             // we want to update this conflicting item, instead of inserting a conflicting item
551 551
                             // so we need to make sure they match entirely (its possible that they only conflicted on one field, but we need them to match on other fields
552 552
                             // for the WHERE conditions in the update). At the time of this comment, there were no models like this
553 553
                             foreach ($model->get_combined_primary_key_fields() as $key_field) {
554
-                                $model_object_data[ $key_field->get_name() ] = $conflicting->get(
554
+                                $model_object_data[$key_field->get_name()] = $conflicting->get(
555 555
                                     $key_field->get_name()
556 556
                                 );
557 557
                             }
@@ -611,7 +611,7 @@  discard block
 block discarded – undo
611 611
         $model_name = $model->get_this_model_name();
612 612
         // if it's a site-to-site export-and-import, see if this modelobject's id
613 613
         // in the old data that we know of
614
-        if (isset($old_db_to_new_db_mapping[ $model_name ][ $id_in_csv ])) {
614
+        if (isset($old_db_to_new_db_mapping[$model_name][$id_in_csv])) {
615 615
             return self::do_update;
616 616
         } else {
617 617
             return self::do_insert;
@@ -666,12 +666,12 @@  discard block
 block discarded – undo
666 666
         // if this model object's primary key is in the mapping, replace it
667 667
         if ($model->has_primary_key_field() &&
668 668
             $model->get_primary_key_field()->is_auto_increment() &&
669
-            isset($old_db_to_new_db_mapping[ $model->get_this_model_name() ]) &&
669
+            isset($old_db_to_new_db_mapping[$model->get_this_model_name()]) &&
670 670
             isset(
671
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $model_object_data[ $model->primary_key_name() ] ]
671
+                $old_db_to_new_db_mapping[$model->get_this_model_name()][$model_object_data[$model->primary_key_name()]]
672 672
             )) {
673
-            $model_object_data[ $model->primary_key_name() ] = $old_db_to_new_db_mapping[ $model->get_this_model_name(
674
-            ) ][ $model_object_data[ $model->primary_key_name() ] ];
673
+            $model_object_data[$model->primary_key_name()] = $old_db_to_new_db_mapping[$model->get_this_model_name(
674
+            )][$model_object_data[$model->primary_key_name()]];
675 675
         }
676 676
 
677 677
         try {
@@ -687,10 +687,10 @@  discard block
 block discarded – undo
687 687
                 $found_a_mapping = false;
688 688
                 foreach ($models_pointed_to as $model_pointed_to_by_fk) {
689 689
                     if ($model_name_field) {
690
-                        $value_of_model_name_field = $model_object_data[ $model_name_field->get_name() ];
690
+                        $value_of_model_name_field = $model_object_data[$model_name_field->get_name()];
691 691
                         if ($value_of_model_name_field == $model_pointed_to_by_fk) {
692
-                            $model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
693
-                                $model_object_data[ $field_obj->get_name() ],
692
+                            $model_object_data[$field_obj->get_name()] = $this->_find_mapping_in(
693
+                                $model_object_data[$field_obj->get_name()],
694 694
                                 $model_pointed_to_by_fk,
695 695
                                 $old_db_to_new_db_mapping,
696 696
                                 $export_from_site_a_to_b
@@ -699,8 +699,8 @@  discard block
 block discarded – undo
699 699
                             break;
700 700
                         }
701 701
                     } else {
702
-                        $model_object_data[ $field_obj->get_name() ] = $this->_find_mapping_in(
703
-                            $model_object_data[ $field_obj->get_name() ],
702
+                        $model_object_data[$field_obj->get_name()] = $this->_find_mapping_in(
703
+                            $model_object_data[$field_obj->get_name()],
704 704
                             $model_pointed_to_by_fk,
705 705
                             $old_db_to_new_db_mapping,
706 706
                             $export_from_site_a_to_b
@@ -763,8 +763,8 @@  discard block
 block discarded – undo
763 763
      */
764 764
     protected function _find_mapping_in($object_id, $model_name, $old_db_to_new_db_mapping, $export_from_site_a_to_b)
765 765
     {
766
-        if (isset($old_db_to_new_db_mapping[ $model_name ][ $object_id ])) {
767
-            return $old_db_to_new_db_mapping[ $model_name ][ $object_id ];
766
+        if (isset($old_db_to_new_db_mapping[$model_name][$object_id])) {
767
+            return $old_db_to_new_db_mapping[$model_name][$object_id];
768 768
         } elseif ($object_id == '0' || $object_id == '') {
769 769
             // leave as-is
770 770
             return $object_id;
@@ -772,7 +772,7 @@  discard block
 block discarded – undo
772 772
             // we couldn't find a mapping for this, and it's from a different site,
773 773
             // so blank it out
774 774
             return null;
775
-        } elseif (! $export_from_site_a_to_b) {
775
+        } elseif ( ! $export_from_site_a_to_b) {
776 776
             // we coudln't find a mapping for this, but it's from thsi DB anyway
777 777
             // so let's just leave it as-is
778 778
             return $object_id;
@@ -792,8 +792,8 @@  discard block
 block discarded – undo
792 792
         // remove the primary key, if there is one (we don't want it for inserts OR updates)
793 793
         // we'll put it back in if we need it
794 794
         if ($model->has_primary_key_field() && $model->get_primary_key_field()->is_auto_increment()) {
795
-            $effective_id = $model_object_data[ $model->primary_key_name() ];
796
-            unset($model_object_data[ $model->primary_key_name() ]);
795
+            $effective_id = $model_object_data[$model->primary_key_name()];
796
+            unset($model_object_data[$model->primary_key_name()]);
797 797
         } else {
798 798
             $effective_id = $model->get_index_primary_key_string($model_object_data);
799 799
         }
@@ -801,7 +801,7 @@  discard block
 block discarded – undo
801 801
         try {
802 802
             $new_id = $model->insert($model_object_data);
803 803
             if ($new_id) {
804
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_id;
804
+                $old_db_to_new_db_mapping[$model->get_this_model_name()][$id_in_csv] = $new_id;
805 805
                 $this->_total_inserts++;
806 806
                 EE_Error::add_success(
807 807
                     sprintf(
@@ -815,7 +815,7 @@  discard block
 block discarded – undo
815 815
                 $this->_total_insert_errors++;
816 816
                 // put the ID used back in there for the error message
817 817
                 if ($model->has_primary_key_field()) {
818
-                    $model_object_data[ $model->primary_key_name() ] = $effective_id;
818
+                    $model_object_data[$model->primary_key_name()] = $effective_id;
819 819
                 }
820 820
                 EE_Error::add_error(
821 821
                     sprintf(
@@ -831,7 +831,7 @@  discard block
 block discarded – undo
831 831
         } catch (EE_Error $e) {
832 832
             $this->_total_insert_errors++;
833 833
             if ($model->has_primary_key_field()) {
834
-                $model_object_data[ $model->primary_key_name() ] = $effective_id;
834
+                $model_object_data[$model->primary_key_name()] = $effective_id;
835 835
             }
836 836
             EE_Error::add_error(
837 837
                 sprintf(
@@ -864,17 +864,17 @@  discard block
 block discarded – undo
864 864
             // one for performing an update, one for everthing else
865 865
             $model_object_data_for_update = $model_object_data;
866 866
             if ($model->has_primary_key_field()) {
867
-                $conditions = array($model->primary_key_name() => $model_object_data[ $model->primary_key_name() ]);
867
+                $conditions = array($model->primary_key_name() => $model_object_data[$model->primary_key_name()]);
868 868
                 // remove the primary key because we shouldn't use it for updating
869
-                unset($model_object_data_for_update[ $model->primary_key_name() ]);
869
+                unset($model_object_data_for_update[$model->primary_key_name()]);
870 870
             } elseif ($model->get_combined_primary_key_fields() > 1) {
871 871
                 $conditions = array();
872 872
                 foreach ($model->get_combined_primary_key_fields() as $key_field) {
873
-                    $conditions[ $key_field->get_name() ] = $model_object_data[ $key_field->get_name() ];
873
+                    $conditions[$key_field->get_name()] = $model_object_data[$key_field->get_name()];
874 874
                 }
875 875
             } else {
876 876
                 $model->primary_key_name(
877
-                );// this shoudl just throw an exception, explaining that we dont have a primary key (or a combine dkey)
877
+                ); // this shoudl just throw an exception, explaining that we dont have a primary key (or a combine dkey)
878 878
             }
879 879
 
880 880
             $success = $model->update($model_object_data_for_update, array($conditions));
@@ -892,15 +892,15 @@  discard block
 block discarded – undo
892 892
                 // we would have last-minute decided to update. So we'd like to know what we updated
893 893
                 // and so we record what record ended up being updated using the mapping
894 894
                 if ($model->has_primary_key_field()) {
895
-                    $new_key_for_mapping = $model_object_data[ $model->primary_key_name() ];
895
+                    $new_key_for_mapping = $model_object_data[$model->primary_key_name()];
896 896
                 } else {
897 897
                     // no primary key just a combined key
898 898
                     $new_key_for_mapping = $model->get_index_primary_key_string($model_object_data);
899 899
                 }
900
-                $old_db_to_new_db_mapping[ $model->get_this_model_name() ][ $id_in_csv ] = $new_key_for_mapping;
900
+                $old_db_to_new_db_mapping[$model->get_this_model_name()][$id_in_csv] = $new_key_for_mapping;
901 901
             } else {
902 902
                 $matched_items = $model->get_all(array($conditions));
903
-                if (! $matched_items) {
903
+                if ( ! $matched_items) {
904 904
                     // no items were matched (so we shouldn't have updated)... but then we should have inserted? what the heck?
905 905
                     $this->_total_update_errors++;
906 906
                     EE_Error::add_error(
@@ -939,7 +939,7 @@  discard block
 block discarded – undo
939 939
                 implode(",", $model_object_data),
940 940
                 $e->getMessage()
941 941
             );
942
-            $debug_message = $basic_message . ' Stack trace: ' . $e->getTraceAsString();
942
+            $debug_message = $basic_message.' Stack trace: '.$e->getTraceAsString();
943 943
             EE_Error::add_error("$basic_message | $debug_message", __FILE__, __FUNCTION__, __LINE__);
944 944
         }
945 945
         return $old_db_to_new_db_mapping;
Please login to merge, or discard this patch.
core/db_classes/EE_Post_Meta.class.php 2 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@  discard block
 block discarded – undo
46 46
      * Sets meta_id
47 47
      *
48 48
      * @param int $meta_id
49
-     * @return boolean
49
+     * @return boolean|null
50 50
      */
51 51
     public function set_meta_id($meta_id)
52 52
     {
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
      * Sets post_id
69 69
      *
70 70
      * @param int $post_id
71
-     * @return boolean
71
+     * @return boolean|null
72 72
      */
73 73
     public function set_post_id($post_id)
74 74
     {
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
      * Sets meta_key
91 91
      *
92 92
      * @param string $meta_key
93
-     * @return boolean
93
+     * @return boolean|null
94 94
      */
95 95
     public function set_meta_key($meta_key)
96 96
     {
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
      * Sets meta_value
113 113
      *
114 114
      * @param mixed $meta_value
115
-     * @return boolean
115
+     * @return boolean|null
116 116
      */
117 117
     public function set_meta_value($meta_value)
118 118
     {
Please login to merge, or discard this patch.
Indentation   +108 added lines, -108 removed lines patch added patch discarded remove patch
@@ -10,112 +10,112 @@
 block discarded – undo
10 10
 class EE_Post_Meta extends EE_Base_Class
11 11
 {
12 12
 
13
-    /**
14
-     * @param array $props_n_values
15
-     * @return EE_Post_Meta|mixed
16
-     */
17
-    public static function new_instance($props_n_values = array())
18
-    {
19
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
-        return $has_object ? $has_object : new self($props_n_values);
21
-    }
22
-
23
-
24
-    /**
25
-     * @param array $props_n_values
26
-     * @return EE_Post_Meta
27
-     */
28
-    public static function new_instance_from_db($props_n_values = array())
29
-    {
30
-        return new self($props_n_values, true);
31
-    }
32
-
33
-
34
-    /**
35
-     * Gets meta_id
36
-     *
37
-     * @return int
38
-     */
39
-    public function meta_id()
40
-    {
41
-        return $this->get('meta_id');
42
-    }
43
-
44
-
45
-    /**
46
-     * Sets meta_id
47
-     *
48
-     * @param int $meta_id
49
-     * @return boolean
50
-     */
51
-    public function set_meta_id($meta_id)
52
-    {
53
-        return $this->set('meta_id', $meta_id);
54
-    }
55
-
56
-    /**
57
-     * Gets post_id
58
-     *
59
-     * @return int
60
-     */
61
-    public function post_id()
62
-    {
63
-        return $this->get('post_id');
64
-    }
65
-
66
-
67
-    /**
68
-     * Sets post_id
69
-     *
70
-     * @param int $post_id
71
-     * @return boolean
72
-     */
73
-    public function set_post_id($post_id)
74
-    {
75
-        return $this->set('post_id', $post_id);
76
-    }
77
-
78
-    /**
79
-     * Gets meta_key
80
-     *
81
-     * @return string
82
-     */
83
-    public function meta_key()
84
-    {
85
-        return $this->get('meta_key');
86
-    }
87
-
88
-
89
-    /**
90
-     * Sets meta_key
91
-     *
92
-     * @param string $meta_key
93
-     * @return boolean
94
-     */
95
-    public function set_meta_key($meta_key)
96
-    {
97
-        return $this->set('meta_key', $meta_key);
98
-    }
99
-
100
-    /**
101
-     * Gets meta_value
102
-     *
103
-     * @return mixed
104
-     */
105
-    public function meta_value()
106
-    {
107
-        return $this->get('meta_value');
108
-    }
109
-
110
-
111
-    /**
112
-     * Sets meta_value
113
-     *
114
-     * @param mixed $meta_value
115
-     * @return boolean
116
-     */
117
-    public function set_meta_value($meta_value)
118
-    {
119
-        return $this->set('meta_value', $meta_value);
120
-    }
13
+	/**
14
+	 * @param array $props_n_values
15
+	 * @return EE_Post_Meta|mixed
16
+	 */
17
+	public static function new_instance($props_n_values = array())
18
+	{
19
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
20
+		return $has_object ? $has_object : new self($props_n_values);
21
+	}
22
+
23
+
24
+	/**
25
+	 * @param array $props_n_values
26
+	 * @return EE_Post_Meta
27
+	 */
28
+	public static function new_instance_from_db($props_n_values = array())
29
+	{
30
+		return new self($props_n_values, true);
31
+	}
32
+
33
+
34
+	/**
35
+	 * Gets meta_id
36
+	 *
37
+	 * @return int
38
+	 */
39
+	public function meta_id()
40
+	{
41
+		return $this->get('meta_id');
42
+	}
43
+
44
+
45
+	/**
46
+	 * Sets meta_id
47
+	 *
48
+	 * @param int $meta_id
49
+	 * @return boolean
50
+	 */
51
+	public function set_meta_id($meta_id)
52
+	{
53
+		return $this->set('meta_id', $meta_id);
54
+	}
55
+
56
+	/**
57
+	 * Gets post_id
58
+	 *
59
+	 * @return int
60
+	 */
61
+	public function post_id()
62
+	{
63
+		return $this->get('post_id');
64
+	}
65
+
66
+
67
+	/**
68
+	 * Sets post_id
69
+	 *
70
+	 * @param int $post_id
71
+	 * @return boolean
72
+	 */
73
+	public function set_post_id($post_id)
74
+	{
75
+		return $this->set('post_id', $post_id);
76
+	}
77
+
78
+	/**
79
+	 * Gets meta_key
80
+	 *
81
+	 * @return string
82
+	 */
83
+	public function meta_key()
84
+	{
85
+		return $this->get('meta_key');
86
+	}
87
+
88
+
89
+	/**
90
+	 * Sets meta_key
91
+	 *
92
+	 * @param string $meta_key
93
+	 * @return boolean
94
+	 */
95
+	public function set_meta_key($meta_key)
96
+	{
97
+		return $this->set('meta_key', $meta_key);
98
+	}
99
+
100
+	/**
101
+	 * Gets meta_value
102
+	 *
103
+	 * @return mixed
104
+	 */
105
+	public function meta_value()
106
+	{
107
+		return $this->get('meta_value');
108
+	}
109
+
110
+
111
+	/**
112
+	 * Sets meta_value
113
+	 *
114
+	 * @param mixed $meta_value
115
+	 * @return boolean
116
+	 */
117
+	public function set_meta_value($meta_value)
118
+	{
119
+		return $this->set('meta_value', $meta_value);
120
+	}
121 121
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question.class.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -371,7 +371,7 @@  discard block
 block discarded – undo
371 371
      * Question, that relationship will be overwritten.
372 372
      *
373 373
      * @param EE_Question_Option $option
374
-     * @return boolean success
374
+     * @return EE_Base_Class success
375 375
      */
376 376
     public function add_option(EE_Question_Option $option)
377 377
     {
@@ -396,7 +396,7 @@  discard block
 block discarded – undo
396 396
      * Marks the option as deleted.
397 397
      *
398 398
      * @param EE_Question_Option $option
399
-     * @return boolean success
399
+     * @return EE_Base_Class success
400 400
      */
401 401
     public function remove_option(EE_Question_Option $option)
402 402
     {
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -335,7 +335,7 @@  discard block
 block discarded – undo
335 335
      */
336 336
     public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
337 337
     {
338
-        if (! $this->ID()) {
338
+        if ( ! $this->ID()) {
339 339
             return array();
340 340
         }
341 341
         $query_params = array();
@@ -509,7 +509,7 @@  discard block
 block discarded – undo
509 509
             ),
510 510
             $input_constructor_args
511 511
         );
512
-        if (! $answer instanceof EE_Answer && $registration instanceof EE_Registration) {
512
+        if ( ! $answer instanceof EE_Answer && $registration instanceof EE_Registration) {
513 513
             $answer = EEM_Answer::instance()->get_registration_question_answer_object($registration, $this->ID());
514 514
         }
515 515
         // has this question been answered ?
@@ -647,7 +647,7 @@  discard block
 block discarded – undo
647 647
                     $this,
648 648
                     $input_constructor_args
649 649
                 );
650
-                if (! $default_input) {
650
+                if ( ! $default_input) {
651 651
                     $default_input = new EE_Text_Input($input_constructor_args);
652 652
                 }
653 653
                 $result = $default_input;
Please login to merge, or discard this patch.
Indentation   +661 added lines, -661 removed lines patch added patch discarded remove patch
@@ -14,665 +14,665 @@
 block discarded – undo
14 14
 class EE_Question extends EE_Soft_Delete_Base_Class implements EEI_Duplicatable
15 15
 {
16 16
 
17
-    /**
18
-     *
19
-     * @param array  $props_n_values          incoming values
20
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
21
-     *                                        used.)
22
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
23
-     *                                        date_format and the second value is the time format
24
-     * @return EE_Question
25
-     */
26
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
27
-    {
28
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
29
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
30
-    }
31
-
32
-
33
-    /**
34
-     * @param array  $props_n_values  incoming values from the database
35
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
36
-     *                                the website will be used.
37
-     * @return EE_Question
38
-     */
39
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
40
-    {
41
-        return new self($props_n_values, true, $timezone);
42
-    }
43
-
44
-
45
-    /**
46
-     *        Set    Question display text
47
-     *
48
-     * @access        public
49
-     * @param string $QST_display_text
50
-     */
51
-    public function set_display_text($QST_display_text = '')
52
-    {
53
-        $this->set('QST_display_text', $QST_display_text);
54
-    }
55
-
56
-
57
-    /**
58
-     *        Set    Question admin text
59
-     *
60
-     * @access        public
61
-     * @param        string $QST_admin_label
62
-     */
63
-    public function set_admin_label($QST_admin_label = '')
64
-    {
65
-        $this->set('QST_admin_label', $QST_admin_label);
66
-    }
67
-
68
-
69
-    /**
70
-     *        Set    system name
71
-     *
72
-     * @access        public
73
-     * @param        mixed $QST_system
74
-     */
75
-    public function set_system_ID($QST_system = '')
76
-    {
77
-        $this->set('QST_system', $QST_system);
78
-    }
79
-
80
-
81
-    /**
82
-     *        Set    question's type
83
-     *
84
-     * @access        public
85
-     * @param        string $QST_type
86
-     */
87
-    public function set_question_type($QST_type = '')
88
-    {
89
-        $this->set('QST_type', $QST_type);
90
-    }
91
-
92
-
93
-    /**
94
-     *        Sets whether this question must be answered when presented in a form
95
-     *
96
-     * @access        public
97
-     * @param        bool $QST_required
98
-     */
99
-    public function set_required($QST_required = false)
100
-    {
101
-        $this->set('QST_required', $QST_required);
102
-    }
103
-
104
-
105
-    /**
106
-     *        Set    Question display text
107
-     *
108
-     * @access        public
109
-     * @param        string $QST_required_text
110
-     */
111
-    public function set_required_text($QST_required_text = '')
112
-    {
113
-        $this->set('QST_required_text', $QST_required_text);
114
-    }
115
-
116
-
117
-    /**
118
-     *        Sets the order of this question when placed in a sequence of questions
119
-     *
120
-     * @access        public
121
-     * @param        int $QST_order
122
-     */
123
-    public function set_order($QST_order = 0)
124
-    {
125
-        $this->set('QST_order', $QST_order);
126
-    }
127
-
128
-
129
-    /**
130
-     *        Sets whether the question is admin-only
131
-     *
132
-     * @access        public
133
-     * @param        bool $QST_admin_only
134
-     */
135
-    public function set_admin_only($QST_admin_only = false)
136
-    {
137
-        $this->set('QST_admin_only', $QST_admin_only);
138
-    }
139
-
140
-
141
-    /**
142
-     *        Sets the wordpress user ID on the question
143
-     *
144
-     * @access        public
145
-     * @param        int $QST_wp_user
146
-     */
147
-    public function set_wp_user($QST_wp_user = 1)
148
-    {
149
-        $this->set('QST_wp_user', $QST_wp_user);
150
-    }
151
-
152
-
153
-    /**
154
-     *        Sets whether the question has been deleted
155
-     *        (we use this boolean instead of actually
156
-     *        deleting it because when users delete this question
157
-     *        they really want to remove the question from future
158
-     *        forms, BUT keep their old answers which depend
159
-     *        on this record actually existing.
160
-     *
161
-     * @access        public
162
-     * @param    bool $QST_deleted
163
-     */
164
-    public function set_deleted($QST_deleted = false)
165
-    {
166
-        $this->set('QST_deleted', $QST_deleted);
167
-    }
168
-
169
-
170
-    /**
171
-     * returns the text for displaying the question to users
172
-     *
173
-     * @access public
174
-     * @return string
175
-     */
176
-    public function display_text()
177
-    {
178
-        return $this->get('QST_display_text');
179
-    }
180
-
181
-
182
-    /**
183
-     * returns the text for the administrative label
184
-     *
185
-     * @access public
186
-     * @return string
187
-     */
188
-    public function admin_label()
189
-    {
190
-        return $this->get('QST_admin_label');
191
-    }
192
-
193
-
194
-    /**
195
-     * returns the attendee column name for this question
196
-     *
197
-     * @access public
198
-     * @return string
199
-     */
200
-    public function system_ID()
201
-    {
202
-        return $this->get('QST_system');
203
-    }
204
-
205
-
206
-    /**
207
-     * returns either a string of 'text', 'textfield', etc.
208
-     *
209
-     * @access public
210
-     * @return boolean
211
-     */
212
-    public function required()
213
-    {
214
-        return $this->get('QST_required');
215
-    }
216
-
217
-
218
-    /**
219
-     * returns the text which should be displayed when a user
220
-     * doesn't answer this question in a form
221
-     *
222
-     * @access public
223
-     * @return string
224
-     */
225
-    public function required_text()
226
-    {
227
-        return $this->get('QST_required_text');
228
-    }
229
-
230
-
231
-    /**
232
-     * returns the type of this question
233
-     *
234
-     * @access public
235
-     * @return string
236
-     */
237
-    public function type()
238
-    {
239
-        return $this->get('QST_type');
240
-    }
241
-
242
-
243
-    /**
244
-     * returns an integer showing where this question should
245
-     * be placed in a sequence of questions
246
-     *
247
-     * @access public
248
-     * @return int
249
-     */
250
-    public function order()
251
-    {
252
-        return $this->get('QST_order');
253
-    }
254
-
255
-
256
-    /**
257
-     * returns whether this question should only appears to admins,
258
-     * or to everyone
259
-     *
260
-     * @access public
261
-     * @return boolean
262
-     */
263
-    public function admin_only()
264
-    {
265
-        return $this->get('QST_admin_only');
266
-    }
267
-
268
-
269
-    /**
270
-     * returns the id the wordpress user who created this question
271
-     *
272
-     * @access public
273
-     * @return int
274
-     */
275
-    public function wp_user()
276
-    {
277
-        return $this->get('QST_wp_user');
278
-    }
279
-
280
-
281
-    /**
282
-     * returns whether this question has been marked as 'deleted'
283
-     *
284
-     * @access public
285
-     * @return boolean
286
-     */
287
-    public function deleted()
288
-    {
289
-        return $this->get('QST_deleted');
290
-    }
291
-
292
-
293
-    /**
294
-     * Gets an array of related EE_Answer  to this EE_Question
295
-     *
296
-     * @return EE_Answer[]
297
-     */
298
-    public function answers()
299
-    {
300
-        return $this->get_many_related('Answer');
301
-    }
302
-
303
-
304
-    /**
305
-     * Boolean check for if there are answers on this question in th db
306
-     *
307
-     * @return boolean true = has answers, false = no answers.
308
-     */
309
-    public function has_answers()
310
-    {
311
-        return $this->count_related('Answer') > 0 ? true : false;
312
-    }
313
-
314
-
315
-    /**
316
-     * gets an array of EE_Question_Group which relate to this question
317
-     *
318
-     * @return EE_Question_Group[]
319
-     */
320
-    public function question_groups()
321
-    {
322
-        return $this->get_many_related('Question_Group');
323
-    }
324
-
325
-
326
-    /**
327
-     * Returns all the options for this question. By default, it returns only the not-yet-deleted ones.
328
-     *
329
-     * @param boolean      $notDeletedOptionsOnly            1
330
-     *                                                       whether to return ALL options, or only the ones which have
331
-     *                                                       not yet been deleleted
332
-     * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
333
-     *                                                       we want to usually only show non-deleted options AND the
334
-     *                                                       value that was selected for the answer, whether it was
335
-     *                                                       trashed or not.
336
-     * @return EE_Question_Option[]
337
-     */
338
-    public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
339
-    {
340
-        if (! $this->ID()) {
341
-            return array();
342
-        }
343
-        $query_params = array();
344
-        if ($selected_value_to_always_include) {
345
-            if (is_array($selected_value_to_always_include)) {
346
-                $query_params[0]['OR*options-query']['QSO_value'] = array('IN', $selected_value_to_always_include);
347
-            } else {
348
-                $query_params[0]['OR*options-query']['QSO_value'] = $selected_value_to_always_include;
349
-            }
350
-        }
351
-        if ($notDeletedOptionsOnly) {
352
-            $query_params[0]['OR*options-query']['QSO_deleted'] = false;
353
-        }
354
-        // order by QSO_order
355
-        $query_params['order_by'] = array('QSO_order' => 'ASC');
356
-        return $this->get_many_related('Question_Option', $query_params);
357
-    }
358
-
359
-
360
-    /**
361
-     * returns an array of EE_Question_Options which relate to this question
362
-     *
363
-     * @return \EE_Question_Option[]
364
-     */
365
-    public function temp_options()
366
-    {
367
-        return $this->_model_relations['Question_Option'];
368
-    }
369
-
370
-
371
-    /**
372
-     * Adds an option for this question. Note: if the option were previously associated with a different
373
-     * Question, that relationship will be overwritten.
374
-     *
375
-     * @param EE_Question_Option $option
376
-     * @return boolean success
377
-     */
378
-    public function add_option(EE_Question_Option $option)
379
-    {
380
-        return $this->_add_relation_to($option, 'Question_Option');
381
-    }
382
-
383
-
384
-    /**
385
-     * Adds an option directly to this question without saving to the db
386
-     *
387
-     * @param EE_Question_Option $option
388
-     * @return boolean success
389
-     */
390
-    public function add_temp_option(EE_Question_Option $option)
391
-    {
392
-        $this->_model_relations['Question_Option'][] = $option;
393
-        return true;
394
-    }
395
-
396
-
397
-    /**
398
-     * Marks the option as deleted.
399
-     *
400
-     * @param EE_Question_Option $option
401
-     * @return boolean success
402
-     */
403
-    public function remove_option(EE_Question_Option $option)
404
-    {
405
-        return $this->_remove_relation_to($option, 'Question_Option');
406
-    }
407
-
408
-
409
-    /**
410
-     * @return bool
411
-     */
412
-    public function is_system_question()
413
-    {
414
-        $system_ID = $this->get('QST_system');
415
-        return ! empty($system_ID) ? true : false;
416
-    }
417
-
418
-
419
-    /**
420
-     * The purpose of this method is set the question order this question order to be the max out of all questions
421
-     *
422
-     * @access public
423
-     * @return void
424
-     */
425
-    public function set_order_to_latest()
426
-    {
427
-        $latest_order = $this->get_model()->get_latest_question_order();
428
-        $latest_order++;
429
-        $this->set('QST_order', $latest_order);
430
-    }
431
-
432
-
433
-    /**
434
-     * Retrieves the list of allowed question types from the model.
435
-     *
436
-     * @return string[]
437
-     */
438
-    private function _allowed_question_types()
439
-    {
440
-        $questionModel = $this->get_model();
441
-        /* @var $questionModel EEM_Question */
442
-        return $questionModel->allowed_question_types();
443
-    }
444
-
445
-    /**
446
-     * Duplicates this question and its question options
447
-     *
448
-     * @return \EE_Question
449
-     */
450
-    public function duplicate($options = array())
451
-    {
452
-        $new_question = clone $this;
453
-        $new_question->set('QST_ID', null);
454
-        $new_question->set_display_text(sprintf(__('%s **Duplicate**', 'event_espresso'), $this->display_text()));
455
-        $new_question->set_admin_label(sprintf(__('%s **Duplicate**', 'event_espresso'), $this->admin_label()));
456
-        $new_question->set_system_ID(null);
457
-        $new_question->set_wp_user(get_current_user_id());
458
-        // if we're duplicating a trashed question, assume we don't want the new one to be trashed
459
-        $new_question->set_deleted(false);
460
-        $success = $new_question->save();
461
-        if ($success) {
462
-            // we don't totally want to duplicate the question options, because we want them to be for the NEW question
463
-            foreach ($this->options() as $question_option) {
464
-                $question_option->duplicate(array('QST_ID' => $new_question->ID()));
465
-            }
466
-            return $new_question;
467
-        } else {
468
-            return null;
469
-        }
470
-    }
471
-
472
-    /**
473
-     * Returns the question's maximum allowed response size
474
-     *
475
-     * @return int|float
476
-     */
477
-    public function max()
478
-    {
479
-        return $this->get('QST_max');
480
-    }
481
-
482
-    /**
483
-     * Sets the question's maximum allowed response size
484
-     *
485
-     * @param int|float $new_max
486
-     * @return void
487
-     */
488
-    public function set_max($new_max)
489
-    {
490
-        $this->set('QST_max', $new_max);
491
-    }
492
-
493
-
494
-    /**
495
-     * Creates a form input from this question which can be used in HTML forms
496
-     *
497
-     * @param EE_Registration $registration
498
-     * @param EE_Answer       $answer
499
-     * @param array           $input_constructor_args
500
-     * @return EE_Form_Input_Base
501
-     */
502
-    public function generate_form_input($registration = null, $answer = null, $input_constructor_args = array())
503
-    {
504
-        $identifier = $this->is_system_question() ? $this->system_ID() : $this->ID();
505
-
506
-        $input_constructor_args = array_merge(
507
-            array(
508
-                'required'                          => $this->required() ? true : false,
509
-                'html_label_text'                   => $this->display_text(),
510
-                'required_validation_error_message' => $this->required_text(),
511
-            ),
512
-            $input_constructor_args
513
-        );
514
-        if (! $answer instanceof EE_Answer && $registration instanceof EE_Registration) {
515
-            $answer = EEM_Answer::instance()->get_registration_question_answer_object($registration, $this->ID());
516
-        }
517
-        // has this question been answered ?
518
-        if ($answer instanceof EE_Answer
519
-            && $answer->value() !== ''
520
-        ) {
521
-            // answer gets htmlspecialchars called on it, undo that please
522
-            // because the form input's display strategy may call esc_attr too
523
-            // which also does html special characters
524
-            $values_with_html_special_chars = $answer->value();
525
-            if (is_array($values_with_html_special_chars)) {
526
-                $default_value = array_map('htmlspecialchars_decode', $values_with_html_special_chars);
527
-            } else {
528
-                $default_value = htmlspecialchars_decode($values_with_html_special_chars);
529
-            }
530
-            $input_constructor_args['default'] = $default_value;
531
-        }
532
-        $max_max_for_question = EEM_Question::instance()->absolute_max_for_system_question($this->system_ID());
533
-        if (in_array(
534
-            $this->type(),
535
-            EEM_Question::instance()->questionTypesWithMaxLength(),
536
-            true
537
-        )) {
538
-            $input_constructor_args['validation_strategies'][] = new EE_Max_Length_Validation_Strategy(
539
-                null,
540
-                min($max_max_for_question, $this->max())
541
-            );
542
-        }
543
-        $input_constructor_args = apply_filters(
544
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__input_constructor_args',
545
-            $input_constructor_args,
546
-            $registration,
547
-            $this,
548
-            $answer
549
-        );
550
-
551
-        $result = null;
552
-        switch ($this->type()) {
553
-            // Text
554
-            case EEM_Question::QST_type_text:
555
-                $result = new EE_Text_Input($input_constructor_args);
556
-                break;
557
-            // Textarea
558
-            case EEM_Question::QST_type_textarea:
559
-                $result = new EE_Text_Area_Input($input_constructor_args);
560
-                break;
561
-            // Radio Buttons
562
-            case EEM_Question::QST_type_radio:
563
-                $result = new EE_Radio_Button_Input($this->options(), $input_constructor_args);
564
-                break;
565
-            // Dropdown
566
-            case EEM_Question::QST_type_dropdown:
567
-                $result = new EE_Select_Input($this->options(), $input_constructor_args);
568
-                break;
569
-            // State Dropdown
570
-            case EEM_Question::QST_type_state:
571
-                $state_options = apply_filters(
572
-                    'FHEE__EE_Question__generate_form_input__state_options',
573
-                    null,
574
-                    $this,
575
-                    $registration,
576
-                    $answer
577
-                );
578
-                $result = new EE_State_Select_Input($state_options, $input_constructor_args);
579
-                break;
580
-            // Country Dropdown
581
-            case EEM_Question::QST_type_country:
582
-                $country_options = apply_filters(
583
-                    'FHEE__EE_Question__generate_form_input__country_options',
584
-                    null,
585
-                    $this,
586
-                    $registration,
587
-                    $answer
588
-                );
589
-                $result = new EE_Country_Select_Input($country_options, $input_constructor_args);
590
-                break;
591
-            // Checkboxes
592
-            case EEM_Question::QST_type_checkbox:
593
-                $result = new EE_Checkbox_Multi_Input($this->options(), $input_constructor_args);
594
-                break;
595
-            // Date
596
-            case EEM_Question::QST_type_date:
597
-                $result = new EE_Datepicker_Input($input_constructor_args);
598
-                break;
599
-            case EEM_Question::QST_type_html_textarea:
600
-                $input_constructor_args['validation_strategies'][] = new EE_Simple_HTML_Validation_Strategy();
601
-                $result = new EE_Text_Area_Input($input_constructor_args);
602
-                $result->remove_validation_strategy('EE_Plaintext_Validation_Strategy');
603
-                break;
604
-            case EEM_Question::QST_type_email:
605
-                    $result = new EE_Email_Input($input_constructor_args);
606
-                break;
607
-            // Email confirm
608
-            case EEM_Question::QST_type_email_confirm:
609
-                $result = new EE_Email_Confirm_Input($input_constructor_args);
610
-                break;
611
-            case EEM_Question::QST_type_us_phone:
612
-                $result = new EE_Phone_Input($input_constructor_args);
613
-                break;
614
-            case EEM_Question::QST_type_int:
615
-                $result = new EE_Integer_Input($input_constructor_args);
616
-                break;
617
-            case EEM_Question::QST_type_decimal:
618
-                $result = new EE_Float_Input($input_constructor_args);
619
-                break;
620
-            case EEM_Question::QST_type_url:
621
-                $input_constructor_args['validation_strategies'][] = LoaderFactory::getLoader()->getNew('EE_URL_Validation_Strategy');
622
-                $result = new EE_Text_Input($input_constructor_args);
623
-                break;
624
-            case EEM_Question::QST_type_year:
625
-                $result = new EE_Year_Input(
626
-                    $input_constructor_args,
627
-                    apply_filters(
628
-                        'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__four_digit',
629
-                        true,
630
-                        $this
631
-                    ),
632
-                    apply_filters(
633
-                        'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__early_range',
634
-                        100,
635
-                        $this
636
-                    ),
637
-                    apply_filters(
638
-                        'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__end_range',
639
-                        100,
640
-                        $this
641
-                    )
642
-                );
643
-                break;
644
-            case EEM_Question::QST_type_multi_select:
645
-                $result = new EE_Select_Multiple_Input($this->options(), $input_constructor_args);
646
-                break;
647
-            // fallback
648
-            default:
649
-                $default_input = apply_filters(
650
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__default',
651
-                    null,
652
-                    $this->type(),
653
-                    $this,
654
-                    $input_constructor_args
655
-                );
656
-                if (! $default_input) {
657
-                    $default_input = new EE_Text_Input($input_constructor_args);
658
-                }
659
-                $result = $default_input;
660
-        }
661
-        return apply_filters('FHEE__EE_Question__generate_form_input__return', $result, $registration, $this, $answer);
662
-    }
663
-
664
-
665
-    /**
666
-     * Returns whether or not this question type should have question option entries
667
-     *
668
-     * @return bool
669
-     */
670
-    public function should_have_question_options()
671
-    {
672
-        return in_array(
673
-            $this->type(),
674
-            $this->_model->question_types_with_options(),
675
-            true
676
-        );
677
-    }
17
+	/**
18
+	 *
19
+	 * @param array  $props_n_values          incoming values
20
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
21
+	 *                                        used.)
22
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
23
+	 *                                        date_format and the second value is the time format
24
+	 * @return EE_Question
25
+	 */
26
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
27
+	{
28
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
29
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
30
+	}
31
+
32
+
33
+	/**
34
+	 * @param array  $props_n_values  incoming values from the database
35
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
36
+	 *                                the website will be used.
37
+	 * @return EE_Question
38
+	 */
39
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
40
+	{
41
+		return new self($props_n_values, true, $timezone);
42
+	}
43
+
44
+
45
+	/**
46
+	 *        Set    Question display text
47
+	 *
48
+	 * @access        public
49
+	 * @param string $QST_display_text
50
+	 */
51
+	public function set_display_text($QST_display_text = '')
52
+	{
53
+		$this->set('QST_display_text', $QST_display_text);
54
+	}
55
+
56
+
57
+	/**
58
+	 *        Set    Question admin text
59
+	 *
60
+	 * @access        public
61
+	 * @param        string $QST_admin_label
62
+	 */
63
+	public function set_admin_label($QST_admin_label = '')
64
+	{
65
+		$this->set('QST_admin_label', $QST_admin_label);
66
+	}
67
+
68
+
69
+	/**
70
+	 *        Set    system name
71
+	 *
72
+	 * @access        public
73
+	 * @param        mixed $QST_system
74
+	 */
75
+	public function set_system_ID($QST_system = '')
76
+	{
77
+		$this->set('QST_system', $QST_system);
78
+	}
79
+
80
+
81
+	/**
82
+	 *        Set    question's type
83
+	 *
84
+	 * @access        public
85
+	 * @param        string $QST_type
86
+	 */
87
+	public function set_question_type($QST_type = '')
88
+	{
89
+		$this->set('QST_type', $QST_type);
90
+	}
91
+
92
+
93
+	/**
94
+	 *        Sets whether this question must be answered when presented in a form
95
+	 *
96
+	 * @access        public
97
+	 * @param        bool $QST_required
98
+	 */
99
+	public function set_required($QST_required = false)
100
+	{
101
+		$this->set('QST_required', $QST_required);
102
+	}
103
+
104
+
105
+	/**
106
+	 *        Set    Question display text
107
+	 *
108
+	 * @access        public
109
+	 * @param        string $QST_required_text
110
+	 */
111
+	public function set_required_text($QST_required_text = '')
112
+	{
113
+		$this->set('QST_required_text', $QST_required_text);
114
+	}
115
+
116
+
117
+	/**
118
+	 *        Sets the order of this question when placed in a sequence of questions
119
+	 *
120
+	 * @access        public
121
+	 * @param        int $QST_order
122
+	 */
123
+	public function set_order($QST_order = 0)
124
+	{
125
+		$this->set('QST_order', $QST_order);
126
+	}
127
+
128
+
129
+	/**
130
+	 *        Sets whether the question is admin-only
131
+	 *
132
+	 * @access        public
133
+	 * @param        bool $QST_admin_only
134
+	 */
135
+	public function set_admin_only($QST_admin_only = false)
136
+	{
137
+		$this->set('QST_admin_only', $QST_admin_only);
138
+	}
139
+
140
+
141
+	/**
142
+	 *        Sets the wordpress user ID on the question
143
+	 *
144
+	 * @access        public
145
+	 * @param        int $QST_wp_user
146
+	 */
147
+	public function set_wp_user($QST_wp_user = 1)
148
+	{
149
+		$this->set('QST_wp_user', $QST_wp_user);
150
+	}
151
+
152
+
153
+	/**
154
+	 *        Sets whether the question has been deleted
155
+	 *        (we use this boolean instead of actually
156
+	 *        deleting it because when users delete this question
157
+	 *        they really want to remove the question from future
158
+	 *        forms, BUT keep their old answers which depend
159
+	 *        on this record actually existing.
160
+	 *
161
+	 * @access        public
162
+	 * @param    bool $QST_deleted
163
+	 */
164
+	public function set_deleted($QST_deleted = false)
165
+	{
166
+		$this->set('QST_deleted', $QST_deleted);
167
+	}
168
+
169
+
170
+	/**
171
+	 * returns the text for displaying the question to users
172
+	 *
173
+	 * @access public
174
+	 * @return string
175
+	 */
176
+	public function display_text()
177
+	{
178
+		return $this->get('QST_display_text');
179
+	}
180
+
181
+
182
+	/**
183
+	 * returns the text for the administrative label
184
+	 *
185
+	 * @access public
186
+	 * @return string
187
+	 */
188
+	public function admin_label()
189
+	{
190
+		return $this->get('QST_admin_label');
191
+	}
192
+
193
+
194
+	/**
195
+	 * returns the attendee column name for this question
196
+	 *
197
+	 * @access public
198
+	 * @return string
199
+	 */
200
+	public function system_ID()
201
+	{
202
+		return $this->get('QST_system');
203
+	}
204
+
205
+
206
+	/**
207
+	 * returns either a string of 'text', 'textfield', etc.
208
+	 *
209
+	 * @access public
210
+	 * @return boolean
211
+	 */
212
+	public function required()
213
+	{
214
+		return $this->get('QST_required');
215
+	}
216
+
217
+
218
+	/**
219
+	 * returns the text which should be displayed when a user
220
+	 * doesn't answer this question in a form
221
+	 *
222
+	 * @access public
223
+	 * @return string
224
+	 */
225
+	public function required_text()
226
+	{
227
+		return $this->get('QST_required_text');
228
+	}
229
+
230
+
231
+	/**
232
+	 * returns the type of this question
233
+	 *
234
+	 * @access public
235
+	 * @return string
236
+	 */
237
+	public function type()
238
+	{
239
+		return $this->get('QST_type');
240
+	}
241
+
242
+
243
+	/**
244
+	 * returns an integer showing where this question should
245
+	 * be placed in a sequence of questions
246
+	 *
247
+	 * @access public
248
+	 * @return int
249
+	 */
250
+	public function order()
251
+	{
252
+		return $this->get('QST_order');
253
+	}
254
+
255
+
256
+	/**
257
+	 * returns whether this question should only appears to admins,
258
+	 * or to everyone
259
+	 *
260
+	 * @access public
261
+	 * @return boolean
262
+	 */
263
+	public function admin_only()
264
+	{
265
+		return $this->get('QST_admin_only');
266
+	}
267
+
268
+
269
+	/**
270
+	 * returns the id the wordpress user who created this question
271
+	 *
272
+	 * @access public
273
+	 * @return int
274
+	 */
275
+	public function wp_user()
276
+	{
277
+		return $this->get('QST_wp_user');
278
+	}
279
+
280
+
281
+	/**
282
+	 * returns whether this question has been marked as 'deleted'
283
+	 *
284
+	 * @access public
285
+	 * @return boolean
286
+	 */
287
+	public function deleted()
288
+	{
289
+		return $this->get('QST_deleted');
290
+	}
291
+
292
+
293
+	/**
294
+	 * Gets an array of related EE_Answer  to this EE_Question
295
+	 *
296
+	 * @return EE_Answer[]
297
+	 */
298
+	public function answers()
299
+	{
300
+		return $this->get_many_related('Answer');
301
+	}
302
+
303
+
304
+	/**
305
+	 * Boolean check for if there are answers on this question in th db
306
+	 *
307
+	 * @return boolean true = has answers, false = no answers.
308
+	 */
309
+	public function has_answers()
310
+	{
311
+		return $this->count_related('Answer') > 0 ? true : false;
312
+	}
313
+
314
+
315
+	/**
316
+	 * gets an array of EE_Question_Group which relate to this question
317
+	 *
318
+	 * @return EE_Question_Group[]
319
+	 */
320
+	public function question_groups()
321
+	{
322
+		return $this->get_many_related('Question_Group');
323
+	}
324
+
325
+
326
+	/**
327
+	 * Returns all the options for this question. By default, it returns only the not-yet-deleted ones.
328
+	 *
329
+	 * @param boolean      $notDeletedOptionsOnly            1
330
+	 *                                                       whether to return ALL options, or only the ones which have
331
+	 *                                                       not yet been deleleted
332
+	 * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
333
+	 *                                                       we want to usually only show non-deleted options AND the
334
+	 *                                                       value that was selected for the answer, whether it was
335
+	 *                                                       trashed or not.
336
+	 * @return EE_Question_Option[]
337
+	 */
338
+	public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
339
+	{
340
+		if (! $this->ID()) {
341
+			return array();
342
+		}
343
+		$query_params = array();
344
+		if ($selected_value_to_always_include) {
345
+			if (is_array($selected_value_to_always_include)) {
346
+				$query_params[0]['OR*options-query']['QSO_value'] = array('IN', $selected_value_to_always_include);
347
+			} else {
348
+				$query_params[0]['OR*options-query']['QSO_value'] = $selected_value_to_always_include;
349
+			}
350
+		}
351
+		if ($notDeletedOptionsOnly) {
352
+			$query_params[0]['OR*options-query']['QSO_deleted'] = false;
353
+		}
354
+		// order by QSO_order
355
+		$query_params['order_by'] = array('QSO_order' => 'ASC');
356
+		return $this->get_many_related('Question_Option', $query_params);
357
+	}
358
+
359
+
360
+	/**
361
+	 * returns an array of EE_Question_Options which relate to this question
362
+	 *
363
+	 * @return \EE_Question_Option[]
364
+	 */
365
+	public function temp_options()
366
+	{
367
+		return $this->_model_relations['Question_Option'];
368
+	}
369
+
370
+
371
+	/**
372
+	 * Adds an option for this question. Note: if the option were previously associated with a different
373
+	 * Question, that relationship will be overwritten.
374
+	 *
375
+	 * @param EE_Question_Option $option
376
+	 * @return boolean success
377
+	 */
378
+	public function add_option(EE_Question_Option $option)
379
+	{
380
+		return $this->_add_relation_to($option, 'Question_Option');
381
+	}
382
+
383
+
384
+	/**
385
+	 * Adds an option directly to this question without saving to the db
386
+	 *
387
+	 * @param EE_Question_Option $option
388
+	 * @return boolean success
389
+	 */
390
+	public function add_temp_option(EE_Question_Option $option)
391
+	{
392
+		$this->_model_relations['Question_Option'][] = $option;
393
+		return true;
394
+	}
395
+
396
+
397
+	/**
398
+	 * Marks the option as deleted.
399
+	 *
400
+	 * @param EE_Question_Option $option
401
+	 * @return boolean success
402
+	 */
403
+	public function remove_option(EE_Question_Option $option)
404
+	{
405
+		return $this->_remove_relation_to($option, 'Question_Option');
406
+	}
407
+
408
+
409
+	/**
410
+	 * @return bool
411
+	 */
412
+	public function is_system_question()
413
+	{
414
+		$system_ID = $this->get('QST_system');
415
+		return ! empty($system_ID) ? true : false;
416
+	}
417
+
418
+
419
+	/**
420
+	 * The purpose of this method is set the question order this question order to be the max out of all questions
421
+	 *
422
+	 * @access public
423
+	 * @return void
424
+	 */
425
+	public function set_order_to_latest()
426
+	{
427
+		$latest_order = $this->get_model()->get_latest_question_order();
428
+		$latest_order++;
429
+		$this->set('QST_order', $latest_order);
430
+	}
431
+
432
+
433
+	/**
434
+	 * Retrieves the list of allowed question types from the model.
435
+	 *
436
+	 * @return string[]
437
+	 */
438
+	private function _allowed_question_types()
439
+	{
440
+		$questionModel = $this->get_model();
441
+		/* @var $questionModel EEM_Question */
442
+		return $questionModel->allowed_question_types();
443
+	}
444
+
445
+	/**
446
+	 * Duplicates this question and its question options
447
+	 *
448
+	 * @return \EE_Question
449
+	 */
450
+	public function duplicate($options = array())
451
+	{
452
+		$new_question = clone $this;
453
+		$new_question->set('QST_ID', null);
454
+		$new_question->set_display_text(sprintf(__('%s **Duplicate**', 'event_espresso'), $this->display_text()));
455
+		$new_question->set_admin_label(sprintf(__('%s **Duplicate**', 'event_espresso'), $this->admin_label()));
456
+		$new_question->set_system_ID(null);
457
+		$new_question->set_wp_user(get_current_user_id());
458
+		// if we're duplicating a trashed question, assume we don't want the new one to be trashed
459
+		$new_question->set_deleted(false);
460
+		$success = $new_question->save();
461
+		if ($success) {
462
+			// we don't totally want to duplicate the question options, because we want them to be for the NEW question
463
+			foreach ($this->options() as $question_option) {
464
+				$question_option->duplicate(array('QST_ID' => $new_question->ID()));
465
+			}
466
+			return $new_question;
467
+		} else {
468
+			return null;
469
+		}
470
+	}
471
+
472
+	/**
473
+	 * Returns the question's maximum allowed response size
474
+	 *
475
+	 * @return int|float
476
+	 */
477
+	public function max()
478
+	{
479
+		return $this->get('QST_max');
480
+	}
481
+
482
+	/**
483
+	 * Sets the question's maximum allowed response size
484
+	 *
485
+	 * @param int|float $new_max
486
+	 * @return void
487
+	 */
488
+	public function set_max($new_max)
489
+	{
490
+		$this->set('QST_max', $new_max);
491
+	}
492
+
493
+
494
+	/**
495
+	 * Creates a form input from this question which can be used in HTML forms
496
+	 *
497
+	 * @param EE_Registration $registration
498
+	 * @param EE_Answer       $answer
499
+	 * @param array           $input_constructor_args
500
+	 * @return EE_Form_Input_Base
501
+	 */
502
+	public function generate_form_input($registration = null, $answer = null, $input_constructor_args = array())
503
+	{
504
+		$identifier = $this->is_system_question() ? $this->system_ID() : $this->ID();
505
+
506
+		$input_constructor_args = array_merge(
507
+			array(
508
+				'required'                          => $this->required() ? true : false,
509
+				'html_label_text'                   => $this->display_text(),
510
+				'required_validation_error_message' => $this->required_text(),
511
+			),
512
+			$input_constructor_args
513
+		);
514
+		if (! $answer instanceof EE_Answer && $registration instanceof EE_Registration) {
515
+			$answer = EEM_Answer::instance()->get_registration_question_answer_object($registration, $this->ID());
516
+		}
517
+		// has this question been answered ?
518
+		if ($answer instanceof EE_Answer
519
+			&& $answer->value() !== ''
520
+		) {
521
+			// answer gets htmlspecialchars called on it, undo that please
522
+			// because the form input's display strategy may call esc_attr too
523
+			// which also does html special characters
524
+			$values_with_html_special_chars = $answer->value();
525
+			if (is_array($values_with_html_special_chars)) {
526
+				$default_value = array_map('htmlspecialchars_decode', $values_with_html_special_chars);
527
+			} else {
528
+				$default_value = htmlspecialchars_decode($values_with_html_special_chars);
529
+			}
530
+			$input_constructor_args['default'] = $default_value;
531
+		}
532
+		$max_max_for_question = EEM_Question::instance()->absolute_max_for_system_question($this->system_ID());
533
+		if (in_array(
534
+			$this->type(),
535
+			EEM_Question::instance()->questionTypesWithMaxLength(),
536
+			true
537
+		)) {
538
+			$input_constructor_args['validation_strategies'][] = new EE_Max_Length_Validation_Strategy(
539
+				null,
540
+				min($max_max_for_question, $this->max())
541
+			);
542
+		}
543
+		$input_constructor_args = apply_filters(
544
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__input_constructor_args',
545
+			$input_constructor_args,
546
+			$registration,
547
+			$this,
548
+			$answer
549
+		);
550
+
551
+		$result = null;
552
+		switch ($this->type()) {
553
+			// Text
554
+			case EEM_Question::QST_type_text:
555
+				$result = new EE_Text_Input($input_constructor_args);
556
+				break;
557
+			// Textarea
558
+			case EEM_Question::QST_type_textarea:
559
+				$result = new EE_Text_Area_Input($input_constructor_args);
560
+				break;
561
+			// Radio Buttons
562
+			case EEM_Question::QST_type_radio:
563
+				$result = new EE_Radio_Button_Input($this->options(), $input_constructor_args);
564
+				break;
565
+			// Dropdown
566
+			case EEM_Question::QST_type_dropdown:
567
+				$result = new EE_Select_Input($this->options(), $input_constructor_args);
568
+				break;
569
+			// State Dropdown
570
+			case EEM_Question::QST_type_state:
571
+				$state_options = apply_filters(
572
+					'FHEE__EE_Question__generate_form_input__state_options',
573
+					null,
574
+					$this,
575
+					$registration,
576
+					$answer
577
+				);
578
+				$result = new EE_State_Select_Input($state_options, $input_constructor_args);
579
+				break;
580
+			// Country Dropdown
581
+			case EEM_Question::QST_type_country:
582
+				$country_options = apply_filters(
583
+					'FHEE__EE_Question__generate_form_input__country_options',
584
+					null,
585
+					$this,
586
+					$registration,
587
+					$answer
588
+				);
589
+				$result = new EE_Country_Select_Input($country_options, $input_constructor_args);
590
+				break;
591
+			// Checkboxes
592
+			case EEM_Question::QST_type_checkbox:
593
+				$result = new EE_Checkbox_Multi_Input($this->options(), $input_constructor_args);
594
+				break;
595
+			// Date
596
+			case EEM_Question::QST_type_date:
597
+				$result = new EE_Datepicker_Input($input_constructor_args);
598
+				break;
599
+			case EEM_Question::QST_type_html_textarea:
600
+				$input_constructor_args['validation_strategies'][] = new EE_Simple_HTML_Validation_Strategy();
601
+				$result = new EE_Text_Area_Input($input_constructor_args);
602
+				$result->remove_validation_strategy('EE_Plaintext_Validation_Strategy');
603
+				break;
604
+			case EEM_Question::QST_type_email:
605
+					$result = new EE_Email_Input($input_constructor_args);
606
+				break;
607
+			// Email confirm
608
+			case EEM_Question::QST_type_email_confirm:
609
+				$result = new EE_Email_Confirm_Input($input_constructor_args);
610
+				break;
611
+			case EEM_Question::QST_type_us_phone:
612
+				$result = new EE_Phone_Input($input_constructor_args);
613
+				break;
614
+			case EEM_Question::QST_type_int:
615
+				$result = new EE_Integer_Input($input_constructor_args);
616
+				break;
617
+			case EEM_Question::QST_type_decimal:
618
+				$result = new EE_Float_Input($input_constructor_args);
619
+				break;
620
+			case EEM_Question::QST_type_url:
621
+				$input_constructor_args['validation_strategies'][] = LoaderFactory::getLoader()->getNew('EE_URL_Validation_Strategy');
622
+				$result = new EE_Text_Input($input_constructor_args);
623
+				break;
624
+			case EEM_Question::QST_type_year:
625
+				$result = new EE_Year_Input(
626
+					$input_constructor_args,
627
+					apply_filters(
628
+						'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__four_digit',
629
+						true,
630
+						$this
631
+					),
632
+					apply_filters(
633
+						'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__early_range',
634
+						100,
635
+						$this
636
+					),
637
+					apply_filters(
638
+						'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__year_question__end_range',
639
+						100,
640
+						$this
641
+					)
642
+				);
643
+				break;
644
+			case EEM_Question::QST_type_multi_select:
645
+				$result = new EE_Select_Multiple_Input($this->options(), $input_constructor_args);
646
+				break;
647
+			// fallback
648
+			default:
649
+				$default_input = apply_filters(
650
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__default',
651
+					null,
652
+					$this->type(),
653
+					$this,
654
+					$input_constructor_args
655
+				);
656
+				if (! $default_input) {
657
+					$default_input = new EE_Text_Input($input_constructor_args);
658
+				}
659
+				$result = $default_input;
660
+		}
661
+		return apply_filters('FHEE__EE_Question__generate_form_input__return', $result, $registration, $this, $answer);
662
+	}
663
+
664
+
665
+	/**
666
+	 * Returns whether or not this question type should have question option entries
667
+	 *
668
+	 * @return bool
669
+	 */
670
+	public function should_have_question_options()
671
+	{
672
+		return in_array(
673
+			$this->type(),
674
+			$this->_model->question_types_with_options(),
675
+			true
676
+		);
677
+	}
678 678
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question_Form_Input.class.php 3 patches
Doc Comments   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
      *        generate_question_form_inputs_for_object
242 242
      *
243 243
      * @access    protected
244
-     * @param bool|object $object $object
244
+     * @param EE_Base_Class|null $object $object
245 245
      * @param    array    $input_types
246 246
      * @return        array
247 247
      */
@@ -354,7 +354,7 @@  discard block
 block discarded – undo
354 354
      *
355 355
      * @access public
356 356
      * @param \EE_Question_Option $QSO EE_Question_Option
357
-     * @return boolean
357
+     * @return boolean|null
358 358
      */
359 359
     public function add_temp_option(EE_Question_Option $QSO)
360 360
     {
@@ -367,8 +367,8 @@  discard block
 block discarded – undo
367 367
      *
368 368
      * @access public
369 369
      * @param    string $property
370
-     * @param    mixed  $value
371
-     * @return mixed
370
+     * @param    boolean  $value
371
+     * @return boolean|null
372 372
      */
373 373
     public function set($property = null, $value = null)
374 374
     {
@@ -416,7 +416,7 @@  discard block
 block discarded – undo
416 416
      *    get_meta
417 417
      *
418 418
      * @access public
419
-     * @param mixed $key
419
+     * @param string $key
420 420
      * @return mixed
421 421
      */
422 422
     public function get_meta($key = false)
Please login to merge, or discard this patch.
Indentation   +431 added lines, -431 removed lines patch added patch discarded remove patch
@@ -13,435 +13,435 @@
 block discarded – undo
13 13
 class EE_Question_Form_Input
14 14
 {
15 15
 
16
-    /**
17
-     *    EE_Question object
18
-     *
19
-     * @access private
20
-     * @var object
21
-     */
22
-    private $_QST = null;
23
-
24
-    /**
25
-     *    EE_Answer object
26
-     *
27
-     * @access private
28
-     * @var object
29
-     */
30
-    private $_ANS = null;
31
-
32
-    /**
33
-     *    $_QST_meta
34
-     * @access private
35
-     * @var array
36
-     */
37
-    private $_QST_meta = array();
38
-
39
-    /**
40
-     *    $QST_input_name
41
-     * @access private
42
-     * @var string
43
-     */
44
-    private $QST_input_name = '';
45
-
46
-    /**
47
-     *    $QST_input_id
48
-     * @access private
49
-     * @var string
50
-     */
51
-    private $QST_input_id = '';
52
-
53
-    /**
54
-     *    $QST_input_class
55
-     * @access private
56
-     * @var string
57
-     */
58
-    private $QST_input_class = '';
59
-
60
-    /**
61
-     * @var bool $QST_disabled
62
-     */
63
-    private $QST_disabled = false;
64
-
65
-
66
-    /**
67
-     * constructor for questions
68
-     *
69
-     * @param \EE_Question $QST EE_Question object
70
-     * @param \EE_Answer   $ANS EE_Answer object
71
-     * @param array        $q_meta
72
-     * @access public
73
-     * @return \EE_Question_Form_Input
74
-     */
75
-    public function __construct(EE_Question $QST = null, EE_Answer $ANS = null, $q_meta = array())
76
-    {
77
-        if (empty($QST) || empty($ANS)) {
78
-            EE_Error::add_error(
79
-                __('An error occurred. A valid EE_Question or EE_Answer object was not received.', 'event_espresso'),
80
-                __FILE__,
81
-                __FUNCTION__,
82
-                __LINE__
83
-            );
84
-            return null;
85
-        }
86
-        $this->_QST = $QST;
87
-        $this->_ANS = $ANS;
88
-        $this->set_question_form_input_meta($q_meta);
89
-        $this->set_question_form_input_init();
90
-    }
91
-
92
-
93
-    /**
94
-     * sets meta data for the question form input
95
-     *
96
-     * @access public
97
-     * @param array $q_meta
98
-     * @return void
99
-     */
100
-    public function set_question_form_input_meta($q_meta = array())
101
-    {
102
-        $default_q_meta = array(
103
-            'att_nmbr'       => 1,
104
-            'ticket_id'      => '',
105
-            'date'           => '',
106
-            'time'           => '',
107
-            'input_name'     => '',
108
-            'input_id'       => '',
109
-            'input_class'    => '',
110
-            'input_prefix'   => 'qstn',
111
-            'append_qstn_id' => true,
112
-            'htmlentities'   => true,
113
-            'allow_null'     => false,
114
-        );
115
-        $this->_QST_meta = array_merge($default_q_meta, $q_meta);
116
-    }
117
-
118
-
119
-    /**
120
-     * set_question_form_input_init
121
-     *
122
-     * @access public
123
-     * @return void
124
-     */
125
-    public function set_question_form_input_init()
126
-    {
127
-        $qstn_id = $this->_QST->system_ID() ? $this->_QST->system_ID() : $this->_QST->ID();
128
-        $this->_set_input_name($qstn_id);
129
-        $this->_set_input_id($qstn_id);
130
-        $this->_set_input_class($qstn_id);
131
-        $this->set_question_form_input_answer($qstn_id);
132
-    }
133
-
134
-
135
-    /**
136
-     * set_input_name
137
-     *
138
-     * @access private
139
-     * @param $qstn_id
140
-     * @return void
141
-     */
142
-    private function _set_input_name($qstn_id)
143
-    {
144
-        if (! empty($qstn_id)) {
145
-            $ANS_ID = $this->get('ANS_ID');
146
-            $qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
147
-        }
148
-        $this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
149
-            ? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
150
-            : $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
151
-    }
152
-
153
-
154
-    /**
155
-     * get property values for question form input
156
-     *
157
-     * @access public
158
-     * @param    string $property
159
-     * @return mixed
160
-     */
161
-    public function get($property = null)
162
-    {
163
-        if (! empty($property)) {
164
-            if (EEM_Question::instance()->has_field($property)) {
165
-                return $this->_QST->get($property);
166
-            } elseif (EEM_Answer::instance()->has_field($property)) {
167
-                return $this->_ANS->get($property);
168
-            } elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
169
-                return $this->{$property};
170
-            }
171
-        }
172
-        return null;
173
-    }
174
-
175
-
176
-    /**
177
-     *    _question_form_input_property_exists
178
-     *
179
-     * @access private
180
-     * @param    string $classname
181
-     * @param    string $property
182
-     * @return boolean
183
-     */
184
-    private function _question_form_input_property_exists($classname, $property)
185
-    {
186
-        // first try regular property exists method which works as expected in PHP 5.3+
187
-        $prop = EEH_Class_Tools::has_property($classname, $property);
188
-        if (! $prop) {
189
-            // use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
190
-            $reflector = new ReflectionClass($classname);
191
-            $prop = $reflector->hasProperty($property);
192
-        }
193
-        return $prop;
194
-    }
195
-
196
-
197
-    /**
198
-     * set_input_id
199
-     *
200
-     * @access private
201
-     * @param $qstn_id
202
-     * @return void
203
-     */
204
-    private function _set_input_id($qstn_id)
205
-    {
206
-        $input_id = isset($this->_QST_meta['input_id']) && ! empty($this->_QST_meta['input_id'])
207
-            ? $this->_QST_meta['input_id']
208
-            : sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
209
-        $this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
210
-            ? $input_id . '-' . $qstn_id
211
-            : $input_id;
212
-    }
213
-
214
-
215
-    /**
216
-     * set_input_class
217
-     *
218
-     * @access private
219
-     * @return void
220
-     */
221
-    private function _set_input_class()
222
-    {
223
-        $this->QST_input_class = isset($this->_QST_meta['input_class']) ? $this->_QST_meta['input_class'] : '';
224
-    }
225
-
226
-
227
-    /**
228
-     * set_question_form_input_answer
229
-     *
230
-     * @access public
231
-     * @param mixed    int | string    $qstn_id
232
-     * @return void
233
-     */
234
-    public function set_question_form_input_answer($qstn_id)
235
-    {
236
-        // check for answer in $_REQUEST in case we are reprocessing a form after an error
237
-        if (isset($this->_QST_meta['EVT_ID'])
238
-            && isset($this->_QST_meta['att_nmbr'])
239
-            && isset($this->_QST_meta['date'])
240
-            && isset($this->_QST_meta['time'])
241
-            && isset($this->_QST_meta['price_id'])
242
-        ) {
243
-            if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])
244
-            ) {
245
-                $answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
246
-                $this->_ANS->set('ANS_value', $answer);
247
-            }
248
-        }
249
-    }
250
-
251
-
252
-    /**
253
-     *        generate_question_form_inputs_for_object
254
-     *
255
-     * @access    protected
256
-     * @param bool|object $object $object
257
-     * @param    array    $input_types
258
-     * @return        array
259
-     */
260
-    public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
261
-    {
262
-        if (! is_object($object)) {
263
-            return false;
264
-        }
265
-        $inputs = array();
266
-        $fields = $object->get_model()->field_settings(false);
267
-        // $pk = $object->ID(); <<< NO!
268
-        // EEH_Debug_Tools::printr( $object, get_class( $object ) . '<br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
269
-        // EEH_Debug_Tools::printr( $fields, '$fields  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
270
-        // EEH_Debug_Tools::printr( $input_types, '$input_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
271
-        foreach ($fields as $field_ID => $field) {
272
-            if ($field instanceof EE_Model_Field_Base) {
273
-                // echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
274
-                // EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
275
-                if (isset($input_types[ $field_ID ])) {
276
-                    // get saved value for field
277
-                    $value = $object->get($field_ID);
278
-                    // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
279
-                    // if no saved value, then use default
280
-                    $value = $value !== null ? $value : $field->get_default_value();
281
-                    // if ( $field_ID == 'CNT_active' )
282
-                    // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
283
-                    // determine question type
284
-                    $type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
285
-                    // input name
286
-                    $input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
287
-                        ? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']'
288
-                        : $field_ID;
289
-                    // css class for input
290
-                    $class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
291
-                        ? ' ' . $input_types[ $field_ID ]['class']
292
-                        : '';
293
-                    // whether to apply htmlentities to answer
294
-                    $htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
295
-                        ? $input_types[ $field_ID ]['htmlentities']
296
-                        : true;
297
-                    // whether to apply htmlentities to answer
298
-                    $label_b4 = isset($input_types[ $field_ID ]['label_b4'])
299
-                        ? $input_types[ $field_ID ]['label_b4']
300
-                        : false;
301
-                    // whether to apply htmlentities to answer
302
-                    $use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
303
-                        ? $input_types[ $field_ID ]['use_desc_4_label']
304
-                        : false;
305
-                    // whether input is disabled
306
-                    $disabled = isset($input_types[ $field_ID ]['disabled'])
307
-                        ? $input_types[ $field_ID ]['disabled']
308
-                        : false;
309
-
310
-                    // create EE_Question_Form_Input object
311
-                    $QFI = new EE_Question_Form_Input(
312
-                        EE_Question::new_instance(
313
-                            array(
314
-                                'QST_ID'           => 0,
315
-                                'QST_display_text' => $field->get_nicename(),
316
-                                'QST_type'         => $type,
317
-                            )
318
-                        ),
319
-                        EE_Answer::new_instance(
320
-                            array(
321
-                                'ANS_ID'    => 0,
322
-                                'QST_ID'    => 0,
323
-                                'REG_ID'    => 0,
324
-                                'ANS_value' => $value,
325
-                            )
326
-                        ),
327
-                        array(
328
-                            'input_id'         => $field_ID . '-' . $object->ID(),
329
-                            'input_name'       => $input_name,
330
-                            'input_class'      => $field_ID . $class,
331
-                            'input_prefix'     => '',
332
-                            'append_qstn_id'   => false,
333
-                            'htmlentities'     => $htmlentities,
334
-                            'label_b4'         => $label_b4,
335
-                            'use_desc_4_label' => $use_desc_4_label,
336
-                        )
337
-                    );
338
-                    // does question type have options ?
339
-                    if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
340
-                        && isset($input_types[ $field_ID ])
341
-                        && isset($input_types[ $field_ID ]['options'])
342
-                    ) {
343
-                        foreach ($input_types[ $field_ID ]['options'] as $option) {
344
-                            $option = stripslashes_deep($option);
345
-                            $option_id = ! empty($option['id']) ? $option['id'] : 0;
346
-                            $QSO = EE_Question_Option::new_instance(
347
-                                array(
348
-                                    'QSO_value'   => (string) $option_id,
349
-                                    'QSO_desc'    => $option['text'],
350
-                                    'QSO_deleted' => false,
351
-                                )
352
-                            );
353
-                            // all QST (and ANS) properties can be accessed indirectly thru QFI
354
-                            $QFI->add_temp_option($QSO);
355
-                        }
356
-                    }
357
-                    // we don't want ppl manually changing primary keys cuz that would just lead to total craziness man
358
-                    if ($disabled || $field_ID == $object->get_model()->primary_key_name()) {
359
-                        $QFI->set('QST_disabled', true);
360
-                    }
361
-                    // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
362
-                    $inputs[ $field_ID ] = $QFI;
363
-                    // if ( $field_ID == 'CNT_active' ) {
364
-                    // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
365
-                    // }
366
-                }
367
-            }
368
-        }
369
-        return $inputs;
370
-    }
371
-
372
-
373
-    /**
374
-     *    add_temp_option
375
-     *
376
-     * @access public
377
-     * @param \EE_Question_Option $QSO EE_Question_Option
378
-     * @return boolean
379
-     */
380
-    public function add_temp_option(EE_Question_Option $QSO)
381
-    {
382
-        $this->_QST->add_temp_option($QSO);
383
-    }
384
-
385
-
386
-    /**
387
-     * set property values for question form input
388
-     *
389
-     * @access public
390
-     * @param    string $property
391
-     * @param    mixed  $value
392
-     * @return mixed
393
-     */
394
-    public function set($property = null, $value = null)
395
-    {
396
-        if (! empty($property)) {
397
-            if (EEM_Question::instance()->has_field($property)) {
398
-                $this->_QST->set($property, $value);
399
-            } elseif (EEM_Answer::instance()->has_field($property)) {
400
-                $this->_ANS->set($property, $value);
401
-            } elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
402
-                // echo "<hr>$property is a prop of QFI";
403
-                $this->{$property} = $value;
404
-                return true;
405
-            }
406
-        }
407
-        return null;
408
-    }
409
-
410
-
411
-    /**
412
-     *    _question_form_input_property_exists
413
-     *
414
-     * @access public
415
-     * @param boolean      $notDeletedOptionsOnly            1
416
-     *                                                       whether to return ALL options, or only the ones which have
417
-     *                                                       not yet been deleted
418
-     * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
419
-     *                                                       we want to usually only show non-deleted options AND the
420
-     *                                                       value that was selected for the answer, whether it was
421
-     *                                                       trashed or not.
422
-     * @return EE_Question_Option
423
-     */
424
-    public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
425
-    {
426
-        $temp_options = $this->_QST->temp_options();
427
-        return ! empty($temp_options)
428
-            ? $temp_options
429
-            : $this->_QST->options(
430
-                $notDeletedOptionsOnly,
431
-                $selected_value_to_always_include
432
-            );
433
-    }
434
-
435
-
436
-    /**
437
-     *    get_meta
438
-     *
439
-     * @access public
440
-     * @param mixed $key
441
-     * @return mixed
442
-     */
443
-    public function get_meta($key = false)
444
-    {
445
-        return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
446
-    }
16
+	/**
17
+	 *    EE_Question object
18
+	 *
19
+	 * @access private
20
+	 * @var object
21
+	 */
22
+	private $_QST = null;
23
+
24
+	/**
25
+	 *    EE_Answer object
26
+	 *
27
+	 * @access private
28
+	 * @var object
29
+	 */
30
+	private $_ANS = null;
31
+
32
+	/**
33
+	 *    $_QST_meta
34
+	 * @access private
35
+	 * @var array
36
+	 */
37
+	private $_QST_meta = array();
38
+
39
+	/**
40
+	 *    $QST_input_name
41
+	 * @access private
42
+	 * @var string
43
+	 */
44
+	private $QST_input_name = '';
45
+
46
+	/**
47
+	 *    $QST_input_id
48
+	 * @access private
49
+	 * @var string
50
+	 */
51
+	private $QST_input_id = '';
52
+
53
+	/**
54
+	 *    $QST_input_class
55
+	 * @access private
56
+	 * @var string
57
+	 */
58
+	private $QST_input_class = '';
59
+
60
+	/**
61
+	 * @var bool $QST_disabled
62
+	 */
63
+	private $QST_disabled = false;
64
+
65
+
66
+	/**
67
+	 * constructor for questions
68
+	 *
69
+	 * @param \EE_Question $QST EE_Question object
70
+	 * @param \EE_Answer   $ANS EE_Answer object
71
+	 * @param array        $q_meta
72
+	 * @access public
73
+	 * @return \EE_Question_Form_Input
74
+	 */
75
+	public function __construct(EE_Question $QST = null, EE_Answer $ANS = null, $q_meta = array())
76
+	{
77
+		if (empty($QST) || empty($ANS)) {
78
+			EE_Error::add_error(
79
+				__('An error occurred. A valid EE_Question or EE_Answer object was not received.', 'event_espresso'),
80
+				__FILE__,
81
+				__FUNCTION__,
82
+				__LINE__
83
+			);
84
+			return null;
85
+		}
86
+		$this->_QST = $QST;
87
+		$this->_ANS = $ANS;
88
+		$this->set_question_form_input_meta($q_meta);
89
+		$this->set_question_form_input_init();
90
+	}
91
+
92
+
93
+	/**
94
+	 * sets meta data for the question form input
95
+	 *
96
+	 * @access public
97
+	 * @param array $q_meta
98
+	 * @return void
99
+	 */
100
+	public function set_question_form_input_meta($q_meta = array())
101
+	{
102
+		$default_q_meta = array(
103
+			'att_nmbr'       => 1,
104
+			'ticket_id'      => '',
105
+			'date'           => '',
106
+			'time'           => '',
107
+			'input_name'     => '',
108
+			'input_id'       => '',
109
+			'input_class'    => '',
110
+			'input_prefix'   => 'qstn',
111
+			'append_qstn_id' => true,
112
+			'htmlentities'   => true,
113
+			'allow_null'     => false,
114
+		);
115
+		$this->_QST_meta = array_merge($default_q_meta, $q_meta);
116
+	}
117
+
118
+
119
+	/**
120
+	 * set_question_form_input_init
121
+	 *
122
+	 * @access public
123
+	 * @return void
124
+	 */
125
+	public function set_question_form_input_init()
126
+	{
127
+		$qstn_id = $this->_QST->system_ID() ? $this->_QST->system_ID() : $this->_QST->ID();
128
+		$this->_set_input_name($qstn_id);
129
+		$this->_set_input_id($qstn_id);
130
+		$this->_set_input_class($qstn_id);
131
+		$this->set_question_form_input_answer($qstn_id);
132
+	}
133
+
134
+
135
+	/**
136
+	 * set_input_name
137
+	 *
138
+	 * @access private
139
+	 * @param $qstn_id
140
+	 * @return void
141
+	 */
142
+	private function _set_input_name($qstn_id)
143
+	{
144
+		if (! empty($qstn_id)) {
145
+			$ANS_ID = $this->get('ANS_ID');
146
+			$qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
147
+		}
148
+		$this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
149
+			? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
150
+			: $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
151
+	}
152
+
153
+
154
+	/**
155
+	 * get property values for question form input
156
+	 *
157
+	 * @access public
158
+	 * @param    string $property
159
+	 * @return mixed
160
+	 */
161
+	public function get($property = null)
162
+	{
163
+		if (! empty($property)) {
164
+			if (EEM_Question::instance()->has_field($property)) {
165
+				return $this->_QST->get($property);
166
+			} elseif (EEM_Answer::instance()->has_field($property)) {
167
+				return $this->_ANS->get($property);
168
+			} elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
169
+				return $this->{$property};
170
+			}
171
+		}
172
+		return null;
173
+	}
174
+
175
+
176
+	/**
177
+	 *    _question_form_input_property_exists
178
+	 *
179
+	 * @access private
180
+	 * @param    string $classname
181
+	 * @param    string $property
182
+	 * @return boolean
183
+	 */
184
+	private function _question_form_input_property_exists($classname, $property)
185
+	{
186
+		// first try regular property exists method which works as expected in PHP 5.3+
187
+		$prop = EEH_Class_Tools::has_property($classname, $property);
188
+		if (! $prop) {
189
+			// use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
190
+			$reflector = new ReflectionClass($classname);
191
+			$prop = $reflector->hasProperty($property);
192
+		}
193
+		return $prop;
194
+	}
195
+
196
+
197
+	/**
198
+	 * set_input_id
199
+	 *
200
+	 * @access private
201
+	 * @param $qstn_id
202
+	 * @return void
203
+	 */
204
+	private function _set_input_id($qstn_id)
205
+	{
206
+		$input_id = isset($this->_QST_meta['input_id']) && ! empty($this->_QST_meta['input_id'])
207
+			? $this->_QST_meta['input_id']
208
+			: sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
209
+		$this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
210
+			? $input_id . '-' . $qstn_id
211
+			: $input_id;
212
+	}
213
+
214
+
215
+	/**
216
+	 * set_input_class
217
+	 *
218
+	 * @access private
219
+	 * @return void
220
+	 */
221
+	private function _set_input_class()
222
+	{
223
+		$this->QST_input_class = isset($this->_QST_meta['input_class']) ? $this->_QST_meta['input_class'] : '';
224
+	}
225
+
226
+
227
+	/**
228
+	 * set_question_form_input_answer
229
+	 *
230
+	 * @access public
231
+	 * @param mixed    int | string    $qstn_id
232
+	 * @return void
233
+	 */
234
+	public function set_question_form_input_answer($qstn_id)
235
+	{
236
+		// check for answer in $_REQUEST in case we are reprocessing a form after an error
237
+		if (isset($this->_QST_meta['EVT_ID'])
238
+			&& isset($this->_QST_meta['att_nmbr'])
239
+			&& isset($this->_QST_meta['date'])
240
+			&& isset($this->_QST_meta['time'])
241
+			&& isset($this->_QST_meta['price_id'])
242
+		) {
243
+			if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])
244
+			) {
245
+				$answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
246
+				$this->_ANS->set('ANS_value', $answer);
247
+			}
248
+		}
249
+	}
250
+
251
+
252
+	/**
253
+	 *        generate_question_form_inputs_for_object
254
+	 *
255
+	 * @access    protected
256
+	 * @param bool|object $object $object
257
+	 * @param    array    $input_types
258
+	 * @return        array
259
+	 */
260
+	public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
261
+	{
262
+		if (! is_object($object)) {
263
+			return false;
264
+		}
265
+		$inputs = array();
266
+		$fields = $object->get_model()->field_settings(false);
267
+		// $pk = $object->ID(); <<< NO!
268
+		// EEH_Debug_Tools::printr( $object, get_class( $object ) . '<br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
269
+		// EEH_Debug_Tools::printr( $fields, '$fields  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
270
+		// EEH_Debug_Tools::printr( $input_types, '$input_types  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
271
+		foreach ($fields as $field_ID => $field) {
272
+			if ($field instanceof EE_Model_Field_Base) {
273
+				// echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
274
+				// EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
275
+				if (isset($input_types[ $field_ID ])) {
276
+					// get saved value for field
277
+					$value = $object->get($field_ID);
278
+					// echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
279
+					// if no saved value, then use default
280
+					$value = $value !== null ? $value : $field->get_default_value();
281
+					// if ( $field_ID == 'CNT_active' )
282
+					// echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
283
+					// determine question type
284
+					$type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
285
+					// input name
286
+					$input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
287
+						? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']'
288
+						: $field_ID;
289
+					// css class for input
290
+					$class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
291
+						? ' ' . $input_types[ $field_ID ]['class']
292
+						: '';
293
+					// whether to apply htmlentities to answer
294
+					$htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
295
+						? $input_types[ $field_ID ]['htmlentities']
296
+						: true;
297
+					// whether to apply htmlentities to answer
298
+					$label_b4 = isset($input_types[ $field_ID ]['label_b4'])
299
+						? $input_types[ $field_ID ]['label_b4']
300
+						: false;
301
+					// whether to apply htmlentities to answer
302
+					$use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
303
+						? $input_types[ $field_ID ]['use_desc_4_label']
304
+						: false;
305
+					// whether input is disabled
306
+					$disabled = isset($input_types[ $field_ID ]['disabled'])
307
+						? $input_types[ $field_ID ]['disabled']
308
+						: false;
309
+
310
+					// create EE_Question_Form_Input object
311
+					$QFI = new EE_Question_Form_Input(
312
+						EE_Question::new_instance(
313
+							array(
314
+								'QST_ID'           => 0,
315
+								'QST_display_text' => $field->get_nicename(),
316
+								'QST_type'         => $type,
317
+							)
318
+						),
319
+						EE_Answer::new_instance(
320
+							array(
321
+								'ANS_ID'    => 0,
322
+								'QST_ID'    => 0,
323
+								'REG_ID'    => 0,
324
+								'ANS_value' => $value,
325
+							)
326
+						),
327
+						array(
328
+							'input_id'         => $field_ID . '-' . $object->ID(),
329
+							'input_name'       => $input_name,
330
+							'input_class'      => $field_ID . $class,
331
+							'input_prefix'     => '',
332
+							'append_qstn_id'   => false,
333
+							'htmlentities'     => $htmlentities,
334
+							'label_b4'         => $label_b4,
335
+							'use_desc_4_label' => $use_desc_4_label,
336
+						)
337
+					);
338
+					// does question type have options ?
339
+					if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
340
+						&& isset($input_types[ $field_ID ])
341
+						&& isset($input_types[ $field_ID ]['options'])
342
+					) {
343
+						foreach ($input_types[ $field_ID ]['options'] as $option) {
344
+							$option = stripslashes_deep($option);
345
+							$option_id = ! empty($option['id']) ? $option['id'] : 0;
346
+							$QSO = EE_Question_Option::new_instance(
347
+								array(
348
+									'QSO_value'   => (string) $option_id,
349
+									'QSO_desc'    => $option['text'],
350
+									'QSO_deleted' => false,
351
+								)
352
+							);
353
+							// all QST (and ANS) properties can be accessed indirectly thru QFI
354
+							$QFI->add_temp_option($QSO);
355
+						}
356
+					}
357
+					// we don't want ppl manually changing primary keys cuz that would just lead to total craziness man
358
+					if ($disabled || $field_ID == $object->get_model()->primary_key_name()) {
359
+						$QFI->set('QST_disabled', true);
360
+					}
361
+					// EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
362
+					$inputs[ $field_ID ] = $QFI;
363
+					// if ( $field_ID == 'CNT_active' ) {
364
+					// EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
365
+					// }
366
+				}
367
+			}
368
+		}
369
+		return $inputs;
370
+	}
371
+
372
+
373
+	/**
374
+	 *    add_temp_option
375
+	 *
376
+	 * @access public
377
+	 * @param \EE_Question_Option $QSO EE_Question_Option
378
+	 * @return boolean
379
+	 */
380
+	public function add_temp_option(EE_Question_Option $QSO)
381
+	{
382
+		$this->_QST->add_temp_option($QSO);
383
+	}
384
+
385
+
386
+	/**
387
+	 * set property values for question form input
388
+	 *
389
+	 * @access public
390
+	 * @param    string $property
391
+	 * @param    mixed  $value
392
+	 * @return mixed
393
+	 */
394
+	public function set($property = null, $value = null)
395
+	{
396
+		if (! empty($property)) {
397
+			if (EEM_Question::instance()->has_field($property)) {
398
+				$this->_QST->set($property, $value);
399
+			} elseif (EEM_Answer::instance()->has_field($property)) {
400
+				$this->_ANS->set($property, $value);
401
+			} elseif ($this->_question_form_input_property_exists(__CLASS__, $property)) {
402
+				// echo "<hr>$property is a prop of QFI";
403
+				$this->{$property} = $value;
404
+				return true;
405
+			}
406
+		}
407
+		return null;
408
+	}
409
+
410
+
411
+	/**
412
+	 *    _question_form_input_property_exists
413
+	 *
414
+	 * @access public
415
+	 * @param boolean      $notDeletedOptionsOnly            1
416
+	 *                                                       whether to return ALL options, or only the ones which have
417
+	 *                                                       not yet been deleted
418
+	 * @param string|array $selected_value_to_always_include , when retrieving options to an ANSWERED question,
419
+	 *                                                       we want to usually only show non-deleted options AND the
420
+	 *                                                       value that was selected for the answer, whether it was
421
+	 *                                                       trashed or not.
422
+	 * @return EE_Question_Option
423
+	 */
424
+	public function options($notDeletedOptionsOnly = true, $selected_value_to_always_include = null)
425
+	{
426
+		$temp_options = $this->_QST->temp_options();
427
+		return ! empty($temp_options)
428
+			? $temp_options
429
+			: $this->_QST->options(
430
+				$notDeletedOptionsOnly,
431
+				$selected_value_to_always_include
432
+			);
433
+	}
434
+
435
+
436
+	/**
437
+	 *    get_meta
438
+	 *
439
+	 * @access public
440
+	 * @param mixed $key
441
+	 * @return mixed
442
+	 */
443
+	public function get_meta($key = false)
444
+	{
445
+		return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
446
+	}
447 447
 }
Please login to merge, or discard this patch.
Spacing   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -141,13 +141,13 @@  discard block
 block discarded – undo
141 141
      */
142 142
     private function _set_input_name($qstn_id)
143 143
     {
144
-        if (! empty($qstn_id)) {
144
+        if ( ! empty($qstn_id)) {
145 145
             $ANS_ID = $this->get('ANS_ID');
146
-            $qstn_id = ! empty($ANS_ID) ? '[' . $qstn_id . '][' . $ANS_ID . ']' : '[' . $qstn_id . ']';
146
+            $qstn_id = ! empty($ANS_ID) ? '['.$qstn_id.']['.$ANS_ID.']' : '['.$qstn_id.']';
147 147
         }
148 148
         $this->QST_input_name = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
149
-            ? $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'] . $qstn_id
150
-            : $this->_QST_meta['input_prefix'] . $this->_QST_meta['input_name'];
149
+            ? $this->_QST_meta['input_prefix'].$this->_QST_meta['input_name'].$qstn_id
150
+            : $this->_QST_meta['input_prefix'].$this->_QST_meta['input_name'];
151 151
     }
152 152
 
153 153
 
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
      */
161 161
     public function get($property = null)
162 162
     {
163
-        if (! empty($property)) {
163
+        if ( ! empty($property)) {
164 164
             if (EEM_Question::instance()->has_field($property)) {
165 165
                 return $this->_QST->get($property);
166 166
             } elseif (EEM_Answer::instance()->has_field($property)) {
@@ -185,7 +185,7 @@  discard block
 block discarded – undo
185 185
     {
186 186
         // first try regular property exists method which works as expected in PHP 5.3+
187 187
         $prop = EEH_Class_Tools::has_property($classname, $property);
188
-        if (! $prop) {
188
+        if ( ! $prop) {
189 189
             // use reflection for < PHP 5.3 as a double check when property is not found, possible due to access restriction
190 190
             $reflector = new ReflectionClass($classname);
191 191
             $prop = $reflector->hasProperty($property);
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
             ? $this->_QST_meta['input_id']
208 208
             : sanitize_key(strip_tags($this->_QST->get('QST_display_text')));
209 209
         $this->QST_input_id = $this->_QST_meta['append_qstn_id'] && ! empty($qstn_id)
210
-            ? $input_id . '-' . $qstn_id
210
+            ? $input_id.'-'.$qstn_id
211 211
             : $input_id;
212 212
     }
213 213
 
@@ -240,9 +240,9 @@  discard block
 block discarded – undo
240 240
             && isset($this->_QST_meta['time'])
241 241
             && isset($this->_QST_meta['price_id'])
242 242
         ) {
243
-            if (isset($_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ])
243
+            if (isset($_REQUEST['qstn'][$this->_QST_meta['EVT_ID']][$this->_QST_meta['att_nmbr']][$this->_QST_meta['date']][$this->_QST_meta['time']][$this->_QST_meta['price_id']][$qstn_id])
244 244
             ) {
245
-                $answer = $_REQUEST['qstn'][ $this->_QST_meta['EVT_ID'] ][ $this->_QST_meta['att_nmbr'] ][ $this->_QST_meta['date'] ][ $this->_QST_meta['time'] ][ $this->_QST_meta['price_id'] ][ $qstn_id ];
245
+                $answer = $_REQUEST['qstn'][$this->_QST_meta['EVT_ID']][$this->_QST_meta['att_nmbr']][$this->_QST_meta['date']][$this->_QST_meta['time']][$this->_QST_meta['price_id']][$qstn_id];
246 246
                 $this->_ANS->set('ANS_value', $answer);
247 247
             }
248 248
         }
@@ -259,7 +259,7 @@  discard block
 block discarded – undo
259 259
      */
260 260
     public static function generate_question_form_inputs_for_object($object = false, $input_types = array())
261 261
     {
262
-        if (! is_object($object)) {
262
+        if ( ! is_object($object)) {
263 263
             return false;
264 264
         }
265 265
         $inputs = array();
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
             if ($field instanceof EE_Model_Field_Base) {
273 273
                 // echo '<h4>$field_ID : ' . $field_ID . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
274 274
                 // EEH_Debug_Tools::printr( $field, '$field  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
275
-                if (isset($input_types[ $field_ID ])) {
275
+                if (isset($input_types[$field_ID])) {
276 276
                     // get saved value for field
277 277
                     $value = $object->get($field_ID);
278 278
                     // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
@@ -281,30 +281,30 @@  discard block
 block discarded – undo
281 281
                     // if ( $field_ID == 'CNT_active' )
282 282
                     // echo '<h4>$value : ' . $value . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
283 283
                     // determine question type
284
-                    $type = isset($input_types[ $field_ID ]) ? $input_types[ $field_ID ]['type'] : 'TEXT';
284
+                    $type = isset($input_types[$field_ID]) ? $input_types[$field_ID]['type'] : 'TEXT';
285 285
                     // input name
286
-                    $input_name = isset($input_types[ $field_ID ]) && isset($input_types[ $field_ID ]['input_name'])
287
-                        ? $input_types[ $field_ID ]['input_name'] . '[' . $field_ID . ']'
286
+                    $input_name = isset($input_types[$field_ID]) && isset($input_types[$field_ID]['input_name'])
287
+                        ? $input_types[$field_ID]['input_name'].'['.$field_ID.']'
288 288
                         : $field_ID;
289 289
                     // css class for input
290
-                    $class = isset($input_types[ $field_ID ]['class']) && ! empty($input_types[ $field_ID ]['class'])
291
-                        ? ' ' . $input_types[ $field_ID ]['class']
290
+                    $class = isset($input_types[$field_ID]['class']) && ! empty($input_types[$field_ID]['class'])
291
+                        ? ' '.$input_types[$field_ID]['class']
292 292
                         : '';
293 293
                     // whether to apply htmlentities to answer
294
-                    $htmlentities = isset($input_types[ $field_ID ]['htmlentities'])
295
-                        ? $input_types[ $field_ID ]['htmlentities']
294
+                    $htmlentities = isset($input_types[$field_ID]['htmlentities'])
295
+                        ? $input_types[$field_ID]['htmlentities']
296 296
                         : true;
297 297
                     // whether to apply htmlentities to answer
298
-                    $label_b4 = isset($input_types[ $field_ID ]['label_b4'])
299
-                        ? $input_types[ $field_ID ]['label_b4']
298
+                    $label_b4 = isset($input_types[$field_ID]['label_b4'])
299
+                        ? $input_types[$field_ID]['label_b4']
300 300
                         : false;
301 301
                     // whether to apply htmlentities to answer
302
-                    $use_desc_4_label = isset($input_types[ $field_ID ]['use_desc_4_label'])
303
-                        ? $input_types[ $field_ID ]['use_desc_4_label']
302
+                    $use_desc_4_label = isset($input_types[$field_ID]['use_desc_4_label'])
303
+                        ? $input_types[$field_ID]['use_desc_4_label']
304 304
                         : false;
305 305
                     // whether input is disabled
306
-                    $disabled = isset($input_types[ $field_ID ]['disabled'])
307
-                        ? $input_types[ $field_ID ]['disabled']
306
+                    $disabled = isset($input_types[$field_ID]['disabled'])
307
+                        ? $input_types[$field_ID]['disabled']
308 308
                         : false;
309 309
 
310 310
                     // create EE_Question_Form_Input object
@@ -325,9 +325,9 @@  discard block
 block discarded – undo
325 325
                             )
326 326
                         ),
327 327
                         array(
328
-                            'input_id'         => $field_ID . '-' . $object->ID(),
328
+                            'input_id'         => $field_ID.'-'.$object->ID(),
329 329
                             'input_name'       => $input_name,
330
-                            'input_class'      => $field_ID . $class,
330
+                            'input_class'      => $field_ID.$class,
331 331
                             'input_prefix'     => '',
332 332
                             'append_qstn_id'   => false,
333 333
                             'htmlentities'     => $htmlentities,
@@ -337,10 +337,10 @@  discard block
 block discarded – undo
337 337
                     );
338 338
                     // does question type have options ?
339 339
                     if (in_array($type, array('DROPDOWN', 'RADIO_BTN', 'CHECKBOX'))
340
-                        && isset($input_types[ $field_ID ])
341
-                        && isset($input_types[ $field_ID ]['options'])
340
+                        && isset($input_types[$field_ID])
341
+                        && isset($input_types[$field_ID]['options'])
342 342
                     ) {
343
-                        foreach ($input_types[ $field_ID ]['options'] as $option) {
343
+                        foreach ($input_types[$field_ID]['options'] as $option) {
344 344
                             $option = stripslashes_deep($option);
345 345
                             $option_id = ! empty($option['id']) ? $option['id'] : 0;
346 346
                             $QSO = EE_Question_Option::new_instance(
@@ -359,7 +359,7 @@  discard block
 block discarded – undo
359 359
                         $QFI->set('QST_disabled', true);
360 360
                     }
361 361
                     // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
362
-                    $inputs[ $field_ID ] = $QFI;
362
+                    $inputs[$field_ID] = $QFI;
363 363
                     // if ( $field_ID == 'CNT_active' ) {
364 364
                     // EEH_Debug_Tools::printr( $QFI, '$QFI  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
365 365
                     // }
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
      */
394 394
     public function set($property = null, $value = null)
395 395
     {
396
-        if (! empty($property)) {
396
+        if ( ! empty($property)) {
397 397
             if (EEM_Question::instance()->has_field($property)) {
398 398
                 $this->_QST->set($property, $value);
399 399
             } elseif (EEM_Answer::instance()->has_field($property)) {
@@ -442,6 +442,6 @@  discard block
 block discarded – undo
442 442
      */
443 443
     public function get_meta($key = false)
444 444
     {
445
-        return $key && isset($this->_QST_meta[ $key ]) ? $this->_QST_meta[ $key ] : false;
445
+        return $key && isset($this->_QST_meta[$key]) ? $this->_QST_meta[$key] : false;
446 446
     }
447 447
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question_Group.class.php 2 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -215,7 +215,7 @@  discard block
 block discarded – undo
215 215
      * Adds the question to this question group
216 216
      *
217 217
      * @param EE_Question || int $question object or ID
218
-     * @return boolean if successful
218
+     * @return EE_Base_Class if successful
219 219
      */
220 220
     public function add_question($questionObjectOrID)
221 221
     {
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
      * Removes the question from this question group
228 228
      *
229 229
      * @param EE_Question || int $question object or ID
230
-     * @return boolean of success
230
+     * @return EE_Base_Class of success
231 231
      */
232 232
     public function remove_question($questionObjectOrID)
233 233
     {
Please login to merge, or discard this patch.
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -12,280 +12,280 @@
 block discarded – undo
12 12
 class EE_Question_Group extends EE_Soft_Delete_Base_Class
13 13
 {
14 14
 
15
-    /**
16
-     * @param array $props_n_values
17
-     * @return EE_Question_Group|mixed
18
-     */
19
-    public static function new_instance($props_n_values = array())
20
-    {
21
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
-        return $has_object ? $has_object : new self($props_n_values);
23
-    }
24
-
25
-
26
-    /**
27
-     * @param array $props_n_values
28
-     * @return EE_Question_Group
29
-     */
30
-    public static function new_instance_from_db($props_n_values = array())
31
-    {
32
-        return new self($props_n_values, true);
33
-    }
34
-
35
-
36
-    /**
37
-     * gets the question group's name
38
-     *
39
-     * @access public
40
-     * @param bool $pretty
41
-     * @return string
42
-     */
43
-    public function name($pretty = false)
44
-    {
45
-        return $pretty ? $this->get_pretty('QSG_name') : $this->get('QSG_name');
46
-    }
47
-
48
-
49
-    /**
50
-     * Gets the question group's internal name
51
-     *
52
-     * @access public
53
-     * @return string
54
-     */
55
-    public function identifier()
56
-    {
57
-        return $this->get('QSG_identifier');
58
-    }
59
-
60
-
61
-    /**
62
-     * Gets the question group's description
63
-     *
64
-     * @access public
65
-     * @param bool $pretty
66
-     * @return string
67
-     */
68
-    public function desc($pretty = false)
69
-    {
70
-        return $pretty ? $this->get_pretty('QSG_desc') : $this->get('QSG_desc');
71
-    }
72
-
73
-
74
-    /**
75
-     * Gets the question group's order number in a sequence
76
-     * of other question groups
77
-     *
78
-     * @access public
79
-     * @return int
80
-     */
81
-    public function order()
82
-    {
83
-        return $this->get('QSG_order');
84
-    }
85
-
86
-
87
-    /**
88
-     * Returns whether to show the group's name on the frontend
89
-     *
90
-     * @access public
91
-     * @return boolean
92
-     */
93
-    public function show_group_name()
94
-    {
95
-        return $this->get('QSG_show_group_name');
96
-    }
97
-
98
-
99
-    /**
100
-     * Returns whether to show the group's description
101
-     * on the frontend
102
-     *
103
-     * @access public
104
-     * @return boolean
105
-     */
106
-    public function show_group_desc()
107
-    {
108
-        return $this->get('QSG_show_group_desc');
109
-    }
110
-
111
-
112
-    /**
113
-     * Returns whether this is a 'system group' (meaning
114
-     * a question group integral to the system, whose questions
115
-     * relate to the attendee table)
116
-     *
117
-     * @access public
118
-     * @return int
119
-     */
120
-    public function system_group()
121
-    {
122
-        return $this->get('QSG_system');
123
-    }
124
-
125
-
126
-    /**
127
-     * get the author of the question group.
128
-     *
129
-     * @since 4.5.0
130
-     *
131
-     * @return int
132
-     */
133
-    public function wp_user()
134
-    {
135
-        return $this->get('QSG_wp_user');
136
-    }
137
-
138
-
139
-    /**
140
-     * Returns whether this question group has
141
-     * been deleted
142
-     *
143
-     * @access public
144
-     * @return boolean
145
-     */
146
-    public function deleted()
147
-    {
148
-        return $this->get('QST_deleted');
149
-    }
150
-
151
-
152
-    /**
153
-     * Gets an array of questions with questions IN the group at the start of the array and questions NOT in the group
154
-     * at the end of the array.  Questions in the group are ordered by Question_Group_Question.QGQ_order and questions
155
-     * NOT in the group are ordered by Question.QGQ_order
156
-     *
157
-     * @return EE_Question[]
158
-     */
159
-    public function questions_in_and_not_in_group()
160
-    {
161
-        $questions_in_group = $this->questions();
162
-        $exclude_question_ids = ! empty($questions_in_group) ? array_keys($questions_in_group) : array();
163
-        $questions_not_in_group = $this->questions_not_in_group($exclude_question_ids);
164
-        return $questions_in_group + $questions_not_in_group;
165
-    }
166
-
167
-
168
-    /**
169
-     * Gets all the questions which are part of this question group (ordered Question_Group_Question.QGQ_order)
170
-     *
171
-     * @param array $query_params
172
-     * @return EE_Question[]
173
-     */
174
-    public function questions($query_params = array())
175
-    {
176
-        $query_params = ! empty($query_params) ? $query_params
177
-            : array('order_by' => array('Question_Group_Question.QGQ_order' => 'ASC'));
178
-        return $this->ID() ? $this->get_many_related('Question', $query_params) : array();
179
-    }
180
-
181
-
182
-    /**
183
-     * Gets all the questions which are NOT part of this question group.
184
-     *
185
-     * @param  mixed $question_IDS_in_group if empty array then all questions returned.  if FALSE then we first get
186
-     *                                      questions in this group and exclude them from questions get all. IF empty
187
-     *                                      array then we just return all questions.
188
-     * @return EE_Question[]
189
-     */
190
-    public function questions_not_in_group($question_IDS_in_group = false)
191
-    {
192
-        if ($question_IDS_in_group === false) {
193
-            $questions = $this->questions();
194
-            $question_IDS_in_group = ! empty($questions) ? array_keys($questions) : array();
195
-        }
196
-        $_where = ! empty($question_IDS_in_group) ? array('QST_ID' => array('not_in', $question_IDS_in_group))
197
-            : array();
198
-
199
-        return EEM_Question::instance()->get_all(array($_where, 'order_by' => array('QST_ID' => 'ASC')));
200
-    }
201
-
202
-
203
-    /**
204
-     * Gets all events which are related to this question group
205
-     *
206
-     * @return EE_Event[]
207
-     */
208
-    public function events()
209
-    {
210
-        return $this->get_many_related('Event');
211
-    }
212
-
213
-
214
-    /**
215
-     * Adds the question to this question group
216
-     *
217
-     * @param EE_Question || int $question object or ID
218
-     * @return boolean if successful
219
-     */
220
-    public function add_question($questionObjectOrID)
221
-    {
222
-        return $this->_add_relation_to($questionObjectOrID, 'Question');
223
-    }
224
-
225
-
226
-    /**
227
-     * Removes the question from this question group
228
-     *
229
-     * @param EE_Question || int $question object or ID
230
-     * @return boolean of success
231
-     */
232
-    public function remove_question($questionObjectOrID)
233
-    {
234
-        return $this->_remove_relation_to($questionObjectOrID, 'Question');
235
-    }
236
-
237
-
238
-    /**
239
-     * @param $questionObjectOrID
240
-     * @param $qst_order
241
-     * @return int
242
-     */
243
-    public function update_question_order($questionObjectOrID, $qst_order)
244
-    {
245
-        $qst_ID = $questionObjectOrID instanceof EE_Question ? $questionObjectOrID->ID() : (int) $questionObjectOrID;
246
-        return EEM_Question_Group_Question::instance()->update(
247
-            array('QGQ_order' => $qst_order),
248
-            array(
249
-                array(
250
-                    'QST_ID' => $qst_ID,
251
-                    'QSG_ID' => $this->ID(),
252
-                ),
253
-            )
254
-        );
255
-    }
256
-
257
-
258
-    /**
259
-     * Basically this is method just returns whether the question group has any questions with answers.  This is used
260
-     * by the admin currently to determine whether we should display the ui for deleting permanently or not b/c
261
-     * question groups with questions that have answers should not be possible to delete permanently
262
-     *
263
-     * @return boolean true if has questions with answers, false if not.
264
-     */
265
-    public function has_questions_with_answers()
266
-    {
267
-        $has_answers = false;
268
-        $questions = $this->get_many_related('Question');
269
-        foreach ($questions as $question) {
270
-            if ($question->count_related('Answer') > 0) {
271
-                $has_answers = true;
272
-            }
273
-        }
274
-        return $has_answers;
275
-    }
276
-
277
-
278
-    /**
279
-     * The purpose of this method is set the question group order for this question group to be the max out of all
280
-     * question groups
281
-     *
282
-     * @access public
283
-     * @return void
284
-     */
285
-    public function set_order_to_latest()
286
-    {
287
-        $latest_order = $this->get_model()->get_latest_question_group_order();
288
-        $latest_order++;
289
-        $this->set('QSG_order', $latest_order);
290
-    }
15
+	/**
16
+	 * @param array $props_n_values
17
+	 * @return EE_Question_Group|mixed
18
+	 */
19
+	public static function new_instance($props_n_values = array())
20
+	{
21
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
+		return $has_object ? $has_object : new self($props_n_values);
23
+	}
24
+
25
+
26
+	/**
27
+	 * @param array $props_n_values
28
+	 * @return EE_Question_Group
29
+	 */
30
+	public static function new_instance_from_db($props_n_values = array())
31
+	{
32
+		return new self($props_n_values, true);
33
+	}
34
+
35
+
36
+	/**
37
+	 * gets the question group's name
38
+	 *
39
+	 * @access public
40
+	 * @param bool $pretty
41
+	 * @return string
42
+	 */
43
+	public function name($pretty = false)
44
+	{
45
+		return $pretty ? $this->get_pretty('QSG_name') : $this->get('QSG_name');
46
+	}
47
+
48
+
49
+	/**
50
+	 * Gets the question group's internal name
51
+	 *
52
+	 * @access public
53
+	 * @return string
54
+	 */
55
+	public function identifier()
56
+	{
57
+		return $this->get('QSG_identifier');
58
+	}
59
+
60
+
61
+	/**
62
+	 * Gets the question group's description
63
+	 *
64
+	 * @access public
65
+	 * @param bool $pretty
66
+	 * @return string
67
+	 */
68
+	public function desc($pretty = false)
69
+	{
70
+		return $pretty ? $this->get_pretty('QSG_desc') : $this->get('QSG_desc');
71
+	}
72
+
73
+
74
+	/**
75
+	 * Gets the question group's order number in a sequence
76
+	 * of other question groups
77
+	 *
78
+	 * @access public
79
+	 * @return int
80
+	 */
81
+	public function order()
82
+	{
83
+		return $this->get('QSG_order');
84
+	}
85
+
86
+
87
+	/**
88
+	 * Returns whether to show the group's name on the frontend
89
+	 *
90
+	 * @access public
91
+	 * @return boolean
92
+	 */
93
+	public function show_group_name()
94
+	{
95
+		return $this->get('QSG_show_group_name');
96
+	}
97
+
98
+
99
+	/**
100
+	 * Returns whether to show the group's description
101
+	 * on the frontend
102
+	 *
103
+	 * @access public
104
+	 * @return boolean
105
+	 */
106
+	public function show_group_desc()
107
+	{
108
+		return $this->get('QSG_show_group_desc');
109
+	}
110
+
111
+
112
+	/**
113
+	 * Returns whether this is a 'system group' (meaning
114
+	 * a question group integral to the system, whose questions
115
+	 * relate to the attendee table)
116
+	 *
117
+	 * @access public
118
+	 * @return int
119
+	 */
120
+	public function system_group()
121
+	{
122
+		return $this->get('QSG_system');
123
+	}
124
+
125
+
126
+	/**
127
+	 * get the author of the question group.
128
+	 *
129
+	 * @since 4.5.0
130
+	 *
131
+	 * @return int
132
+	 */
133
+	public function wp_user()
134
+	{
135
+		return $this->get('QSG_wp_user');
136
+	}
137
+
138
+
139
+	/**
140
+	 * Returns whether this question group has
141
+	 * been deleted
142
+	 *
143
+	 * @access public
144
+	 * @return boolean
145
+	 */
146
+	public function deleted()
147
+	{
148
+		return $this->get('QST_deleted');
149
+	}
150
+
151
+
152
+	/**
153
+	 * Gets an array of questions with questions IN the group at the start of the array and questions NOT in the group
154
+	 * at the end of the array.  Questions in the group are ordered by Question_Group_Question.QGQ_order and questions
155
+	 * NOT in the group are ordered by Question.QGQ_order
156
+	 *
157
+	 * @return EE_Question[]
158
+	 */
159
+	public function questions_in_and_not_in_group()
160
+	{
161
+		$questions_in_group = $this->questions();
162
+		$exclude_question_ids = ! empty($questions_in_group) ? array_keys($questions_in_group) : array();
163
+		$questions_not_in_group = $this->questions_not_in_group($exclude_question_ids);
164
+		return $questions_in_group + $questions_not_in_group;
165
+	}
166
+
167
+
168
+	/**
169
+	 * Gets all the questions which are part of this question group (ordered Question_Group_Question.QGQ_order)
170
+	 *
171
+	 * @param array $query_params
172
+	 * @return EE_Question[]
173
+	 */
174
+	public function questions($query_params = array())
175
+	{
176
+		$query_params = ! empty($query_params) ? $query_params
177
+			: array('order_by' => array('Question_Group_Question.QGQ_order' => 'ASC'));
178
+		return $this->ID() ? $this->get_many_related('Question', $query_params) : array();
179
+	}
180
+
181
+
182
+	/**
183
+	 * Gets all the questions which are NOT part of this question group.
184
+	 *
185
+	 * @param  mixed $question_IDS_in_group if empty array then all questions returned.  if FALSE then we first get
186
+	 *                                      questions in this group and exclude them from questions get all. IF empty
187
+	 *                                      array then we just return all questions.
188
+	 * @return EE_Question[]
189
+	 */
190
+	public function questions_not_in_group($question_IDS_in_group = false)
191
+	{
192
+		if ($question_IDS_in_group === false) {
193
+			$questions = $this->questions();
194
+			$question_IDS_in_group = ! empty($questions) ? array_keys($questions) : array();
195
+		}
196
+		$_where = ! empty($question_IDS_in_group) ? array('QST_ID' => array('not_in', $question_IDS_in_group))
197
+			: array();
198
+
199
+		return EEM_Question::instance()->get_all(array($_where, 'order_by' => array('QST_ID' => 'ASC')));
200
+	}
201
+
202
+
203
+	/**
204
+	 * Gets all events which are related to this question group
205
+	 *
206
+	 * @return EE_Event[]
207
+	 */
208
+	public function events()
209
+	{
210
+		return $this->get_many_related('Event');
211
+	}
212
+
213
+
214
+	/**
215
+	 * Adds the question to this question group
216
+	 *
217
+	 * @param EE_Question || int $question object or ID
218
+	 * @return boolean if successful
219
+	 */
220
+	public function add_question($questionObjectOrID)
221
+	{
222
+		return $this->_add_relation_to($questionObjectOrID, 'Question');
223
+	}
224
+
225
+
226
+	/**
227
+	 * Removes the question from this question group
228
+	 *
229
+	 * @param EE_Question || int $question object or ID
230
+	 * @return boolean of success
231
+	 */
232
+	public function remove_question($questionObjectOrID)
233
+	{
234
+		return $this->_remove_relation_to($questionObjectOrID, 'Question');
235
+	}
236
+
237
+
238
+	/**
239
+	 * @param $questionObjectOrID
240
+	 * @param $qst_order
241
+	 * @return int
242
+	 */
243
+	public function update_question_order($questionObjectOrID, $qst_order)
244
+	{
245
+		$qst_ID = $questionObjectOrID instanceof EE_Question ? $questionObjectOrID->ID() : (int) $questionObjectOrID;
246
+		return EEM_Question_Group_Question::instance()->update(
247
+			array('QGQ_order' => $qst_order),
248
+			array(
249
+				array(
250
+					'QST_ID' => $qst_ID,
251
+					'QSG_ID' => $this->ID(),
252
+				),
253
+			)
254
+		);
255
+	}
256
+
257
+
258
+	/**
259
+	 * Basically this is method just returns whether the question group has any questions with answers.  This is used
260
+	 * by the admin currently to determine whether we should display the ui for deleting permanently or not b/c
261
+	 * question groups with questions that have answers should not be possible to delete permanently
262
+	 *
263
+	 * @return boolean true if has questions with answers, false if not.
264
+	 */
265
+	public function has_questions_with_answers()
266
+	{
267
+		$has_answers = false;
268
+		$questions = $this->get_many_related('Question');
269
+		foreach ($questions as $question) {
270
+			if ($question->count_related('Answer') > 0) {
271
+				$has_answers = true;
272
+			}
273
+		}
274
+		return $has_answers;
275
+	}
276
+
277
+
278
+	/**
279
+	 * The purpose of this method is set the question group order for this question group to be the max out of all
280
+	 * question groups
281
+	 *
282
+	 * @access public
283
+	 * @return void
284
+	 */
285
+	public function set_order_to_latest()
286
+	{
287
+		$latest_order = $this->get_model()->get_latest_question_group_order();
288
+		$latest_order++;
289
+		$this->set('QSG_order', $latest_order);
290
+	}
291 291
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Question_Option.class.php 2 patches
Doc Comments   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -39,7 +39,7 @@  discard block
 block discarded – undo
39 39
      * @param array  $props_n_values  incoming values from the database
40 40
      * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
41 41
      *                                the website will be used.
42
-     * @return EE_Attendee
42
+     * @return EE_Question_Option
43 43
      */
44 44
     public static function new_instance_from_db($props_n_values = array(), $timezone = null)
45 45
     {
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
      * Sets the option's key value
52 52
      *
53 53
      * @param string $value
54
-     * @return bool success
54
+     * @return boolean|null success
55 55
      */
56 56
     public function set_value($value)
57 57
     {
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
      * Sets the option's Display Text
64 64
      *
65 65
      * @param string $text
66
-     * @return bool success
66
+     * @return boolean|null success
67 67
      */
68 68
     public function set_desc($text)
69 69
     {
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
      *
77 77
      * @access public
78 78
      * @param integer $order
79
-     * @return bool      $success
79
+     * @return boolean|null      $success
80 80
      */
81 81
     public function set_order($order)
82 82
     {
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
      * Sets the ID of the related question
89 89
      *
90 90
      * @param int $question_ID
91
-     * @return bool success
91
+     * @return boolean|null success
92 92
      */
93 93
     public function set_question_ID($question_ID)
94 94
     {
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
      * Sets the option's opt_group
101 101
      *
102 102
      * @param string $text
103
-     * @return bool success
103
+     * @return string success
104 104
      */
105 105
     public function set_opt_group($text)
106 106
     {
@@ -220,7 +220,7 @@  discard block
 block discarded – undo
220 220
      * Sets QSO_system
221 221
      *
222 222
      * @param string $QSO_system
223
-     * @return bool
223
+     * @return boolean|null
224 224
      */
225 225
     public function set_system($QSO_system)
226 226
     {
Please login to merge, or discard this patch.
Indentation   +216 added lines, -216 removed lines patch added patch discarded remove patch
@@ -10,220 +10,220 @@
 block discarded – undo
10 10
 class EE_Question_Option extends EE_Soft_Delete_Base_Class implements EEI_Duplicatable
11 11
 {
12 12
 
13
-    /**
14
-     * Question Option Opt Group Name
15
-     *
16
-     * @access protected
17
-     * @var string
18
-     */
19
-    protected $_QSO_opt_group = null;
20
-
21
-
22
-    /**
23
-     *
24
-     * @param array  $props_n_values          incoming values
25
-     * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
26
-     *                                        used.)
27
-     * @param array  $date_formats            incoming date_formats in an array where the first value is the
28
-     *                                        date_format and the second value is the time format
29
-     * @return EE_Attendee
30
-     */
31
-    public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
32
-    {
33
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
34
-        return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
35
-    }
36
-
37
-
38
-    /**
39
-     * @param array  $props_n_values  incoming values from the database
40
-     * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
41
-     *                                the website will be used.
42
-     * @return EE_Attendee
43
-     */
44
-    public static function new_instance_from_db($props_n_values = array(), $timezone = null)
45
-    {
46
-        return new self($props_n_values, true, $timezone);
47
-    }
48
-
49
-
50
-    /**
51
-     * Sets the option's key value
52
-     *
53
-     * @param string $value
54
-     * @return bool success
55
-     */
56
-    public function set_value($value)
57
-    {
58
-        $this->set('QSO_value', $value);
59
-    }
60
-
61
-
62
-    /**
63
-     * Sets the option's Display Text
64
-     *
65
-     * @param string $text
66
-     * @return bool success
67
-     */
68
-    public function set_desc($text)
69
-    {
70
-        $this->set('QSO_desc', $text);
71
-    }
72
-
73
-
74
-    /**
75
-     * Sets the order for this option
76
-     *
77
-     * @access public
78
-     * @param integer $order
79
-     * @return bool      $success
80
-     */
81
-    public function set_order($order)
82
-    {
83
-        $this->set('QSO_order', $order);
84
-    }
85
-
86
-
87
-    /**
88
-     * Sets the ID of the related question
89
-     *
90
-     * @param int $question_ID
91
-     * @return bool success
92
-     */
93
-    public function set_question_ID($question_ID)
94
-    {
95
-        $this->set('QST_ID', $question_ID);
96
-    }
97
-
98
-
99
-    /**
100
-     * Sets the option's opt_group
101
-     *
102
-     * @param string $text
103
-     * @return bool success
104
-     */
105
-    public function set_opt_group($text)
106
-    {
107
-        return $this->_QSO_opt_group = $text;
108
-    }
109
-
110
-
111
-    /**
112
-     * Gets the option's key value
113
-     *
114
-     * @return string
115
-     */
116
-    public function value()
117
-    {
118
-        return $this->get('QSO_value');
119
-    }
120
-
121
-
122
-    /**
123
-     * Gets the option's display text
124
-     *
125
-     * @return string
126
-     */
127
-    public function desc()
128
-    {
129
-        return $this->get('QSO_desc');
130
-    }
131
-
132
-
133
-    /**
134
-     * Returns whether this option has been deleted or not
135
-     *
136
-     * @return boolean
137
-     */
138
-    public function deleted()
139
-    {
140
-        return $this->get('QSO_deleted');
141
-    }
142
-
143
-
144
-    /**
145
-     * Returns the order or the Question Option
146
-     *
147
-     * @access public
148
-     * @return integer
149
-     */
150
-    public function order()
151
-    {
152
-        return $this->get('QSO_option');
153
-    }
154
-
155
-
156
-    /**
157
-     * Gets the related question's ID
158
-     *
159
-     * @return int
160
-     */
161
-    public function question_ID()
162
-    {
163
-        return $this->get('QST_ID');
164
-    }
165
-
166
-
167
-    /**
168
-     * Returns the question related to this question option
169
-     *
170
-     * @return EE_Question
171
-     */
172
-    public function question()
173
-    {
174
-        return $this->get_first_related('Question');
175
-    }
176
-
177
-
178
-    /**
179
-     * Gets the option's opt_group
180
-     *
181
-     * @return string
182
-     */
183
-    public function opt_group()
184
-    {
185
-        return $this->_QSO_opt_group;
186
-    }
187
-
188
-    /**
189
-     * Duplicates this question option. By default the new question option will be for the same question,
190
-     * but that can be overriden by setting the 'QST_ID' option
191
-     *
192
-     * @param array $options {
193
-     * @type int    $QST_ID  the QST_ID attribute of this question option, otherwise it will be for the same question
194
-     *                       as the original
195
-     */
196
-    public function duplicate($options = array())
197
-    {
198
-        $new_question_option = clone $this;
199
-        $new_question_option->set('QSO_ID', null);
200
-        if (array_key_exists(
201
-            'QST_ID',
202
-            $options
203
-        )) {// use array_key_exists instead of isset because NULL might be a valid value
204
-            $new_question_option->set_question_ID($options['QST_ID']);
205
-        }
206
-        $new_question_option->save();
207
-    }
208
-
209
-    /**
210
-     * Gets the QSO_system value
211
-     *
212
-     * @return string|null
213
-     */
214
-    public function system()
215
-    {
216
-        return $this->get('QSO_system');
217
-    }
218
-
219
-    /**
220
-     * Sets QSO_system
221
-     *
222
-     * @param string $QSO_system
223
-     * @return bool
224
-     */
225
-    public function set_system($QSO_system)
226
-    {
227
-        return $this->set('QSO_system', $QSO_system);
228
-    }
13
+	/**
14
+	 * Question Option Opt Group Name
15
+	 *
16
+	 * @access protected
17
+	 * @var string
18
+	 */
19
+	protected $_QSO_opt_group = null;
20
+
21
+
22
+	/**
23
+	 *
24
+	 * @param array  $props_n_values          incoming values
25
+	 * @param string $timezone                incoming timezone (if not set the timezone set for the website will be
26
+	 *                                        used.)
27
+	 * @param array  $date_formats            incoming date_formats in an array where the first value is the
28
+	 *                                        date_format and the second value is the time format
29
+	 * @return EE_Attendee
30
+	 */
31
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array())
32
+	{
33
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
34
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
35
+	}
36
+
37
+
38
+	/**
39
+	 * @param array  $props_n_values  incoming values from the database
40
+	 * @param string $timezone        incoming timezone as set by the model.  If not set the timezone for
41
+	 *                                the website will be used.
42
+	 * @return EE_Attendee
43
+	 */
44
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null)
45
+	{
46
+		return new self($props_n_values, true, $timezone);
47
+	}
48
+
49
+
50
+	/**
51
+	 * Sets the option's key value
52
+	 *
53
+	 * @param string $value
54
+	 * @return bool success
55
+	 */
56
+	public function set_value($value)
57
+	{
58
+		$this->set('QSO_value', $value);
59
+	}
60
+
61
+
62
+	/**
63
+	 * Sets the option's Display Text
64
+	 *
65
+	 * @param string $text
66
+	 * @return bool success
67
+	 */
68
+	public function set_desc($text)
69
+	{
70
+		$this->set('QSO_desc', $text);
71
+	}
72
+
73
+
74
+	/**
75
+	 * Sets the order for this option
76
+	 *
77
+	 * @access public
78
+	 * @param integer $order
79
+	 * @return bool      $success
80
+	 */
81
+	public function set_order($order)
82
+	{
83
+		$this->set('QSO_order', $order);
84
+	}
85
+
86
+
87
+	/**
88
+	 * Sets the ID of the related question
89
+	 *
90
+	 * @param int $question_ID
91
+	 * @return bool success
92
+	 */
93
+	public function set_question_ID($question_ID)
94
+	{
95
+		$this->set('QST_ID', $question_ID);
96
+	}
97
+
98
+
99
+	/**
100
+	 * Sets the option's opt_group
101
+	 *
102
+	 * @param string $text
103
+	 * @return bool success
104
+	 */
105
+	public function set_opt_group($text)
106
+	{
107
+		return $this->_QSO_opt_group = $text;
108
+	}
109
+
110
+
111
+	/**
112
+	 * Gets the option's key value
113
+	 *
114
+	 * @return string
115
+	 */
116
+	public function value()
117
+	{
118
+		return $this->get('QSO_value');
119
+	}
120
+
121
+
122
+	/**
123
+	 * Gets the option's display text
124
+	 *
125
+	 * @return string
126
+	 */
127
+	public function desc()
128
+	{
129
+		return $this->get('QSO_desc');
130
+	}
131
+
132
+
133
+	/**
134
+	 * Returns whether this option has been deleted or not
135
+	 *
136
+	 * @return boolean
137
+	 */
138
+	public function deleted()
139
+	{
140
+		return $this->get('QSO_deleted');
141
+	}
142
+
143
+
144
+	/**
145
+	 * Returns the order or the Question Option
146
+	 *
147
+	 * @access public
148
+	 * @return integer
149
+	 */
150
+	public function order()
151
+	{
152
+		return $this->get('QSO_option');
153
+	}
154
+
155
+
156
+	/**
157
+	 * Gets the related question's ID
158
+	 *
159
+	 * @return int
160
+	 */
161
+	public function question_ID()
162
+	{
163
+		return $this->get('QST_ID');
164
+	}
165
+
166
+
167
+	/**
168
+	 * Returns the question related to this question option
169
+	 *
170
+	 * @return EE_Question
171
+	 */
172
+	public function question()
173
+	{
174
+		return $this->get_first_related('Question');
175
+	}
176
+
177
+
178
+	/**
179
+	 * Gets the option's opt_group
180
+	 *
181
+	 * @return string
182
+	 */
183
+	public function opt_group()
184
+	{
185
+		return $this->_QSO_opt_group;
186
+	}
187
+
188
+	/**
189
+	 * Duplicates this question option. By default the new question option will be for the same question,
190
+	 * but that can be overriden by setting the 'QST_ID' option
191
+	 *
192
+	 * @param array $options {
193
+	 * @type int    $QST_ID  the QST_ID attribute of this question option, otherwise it will be for the same question
194
+	 *                       as the original
195
+	 */
196
+	public function duplicate($options = array())
197
+	{
198
+		$new_question_option = clone $this;
199
+		$new_question_option->set('QSO_ID', null);
200
+		if (array_key_exists(
201
+			'QST_ID',
202
+			$options
203
+		)) {// use array_key_exists instead of isset because NULL might be a valid value
204
+			$new_question_option->set_question_ID($options['QST_ID']);
205
+		}
206
+		$new_question_option->save();
207
+	}
208
+
209
+	/**
210
+	 * Gets the QSO_system value
211
+	 *
212
+	 * @return string|null
213
+	 */
214
+	public function system()
215
+	{
216
+		return $this->get('QSO_system');
217
+	}
218
+
219
+	/**
220
+	 * Sets QSO_system
221
+	 *
222
+	 * @param string $QSO_system
223
+	 * @return bool
224
+	 */
225
+	public function set_system($QSO_system)
226
+	{
227
+		return $this->set('QSO_system', $QSO_system);
228
+	}
229 229
 }
Please login to merge, or discard this patch.
core/db_classes/EE_Status.class.php 3 patches
Doc Comments   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
      * Sets code
53 53
      *
54 54
      * @param string $code
55
-     * @return boolean
55
+     * @return boolean|null
56 56
      */
57 57
     public function set_code($code)
58 58
     {
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
      * Sets desc
76 76
      *
77 77
      * @param string $desc
78
-     * @return boolean
78
+     * @return boolean|null
79 79
      */
80 80
     public function set_desc($desc)
81 81
     {
@@ -98,7 +98,7 @@  discard block
 block discarded – undo
98 98
      * Sets type
99 99
      *
100 100
      * @param string $type
101
-     * @return boolean
101
+     * @return boolean|null
102 102
      */
103 103
     public function set_type($type)
104 104
     {
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
      * Sets can_edit
122 122
      *
123 123
      * @param boolean $can_edit
124
-     * @return boolean
124
+     * @return boolean|null
125 125
      */
126 126
     public function set_can_edit($can_edit)
127 127
     {
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
      * Sets open
145 145
      *
146 146
      * @param boolean $open
147
-     * @return boolean
147
+     * @return boolean|null
148 148
      */
149 149
     public function set_open($open)
150 150
     {
Please login to merge, or discard this patch.
Indentation   +138 added lines, -138 removed lines patch added patch discarded remove patch
@@ -12,142 +12,142 @@
 block discarded – undo
12 12
 class EE_Status extends EE_Base_Class
13 13
 {
14 14
 
15
-    /**
16
-     * @param array $props_n_values
17
-     * @return EE_Status
18
-     */
19
-    public static function new_instance($props_n_values = array())
20
-    {
21
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
-        return $has_object ? $has_object : new self($props_n_values);
23
-    }
24
-
25
-
26
-    /**
27
-     * @param array $props_n_values
28
-     * @return EE_Status
29
-     */
30
-    public static function new_instance_from_db($props_n_values = array())
31
-    {
32
-        return new self($props_n_values, true);
33
-    }
34
-
35
-
36
-    /**
37
-     * Gets code
38
-     *
39
-     * @param bool   $plural
40
-     * @param string $schema
41
-     * @return string
42
-     */
43
-    public function code($plural = false, $schema = 'upper')
44
-    {
45
-        $id = $this->get('STS_ID');
46
-        $code = EEM_Status::instance()->localized_status(array($id => $this->get('STS_code')), $plural, $schema);
47
-        return $code[ $id ];
48
-    }
49
-
50
-
51
-    /**
52
-     * Sets code
53
-     *
54
-     * @param string $code
55
-     * @return boolean
56
-     */
57
-    public function set_code($code)
58
-    {
59
-        $this->set('STS_code', $code);
60
-    }
61
-
62
-
63
-    /**
64
-     * Gets desc
65
-     *
66
-     * @return string
67
-     */
68
-    public function desc()
69
-    {
70
-        return $this->get('STS_desc');
71
-    }
72
-
73
-
74
-    /**
75
-     * Sets desc
76
-     *
77
-     * @param string $desc
78
-     * @return boolean
79
-     */
80
-    public function set_desc($desc)
81
-    {
82
-        $this->set('STS_desc', $desc);
83
-    }
84
-
85
-
86
-    /**
87
-     * Gets type
88
-     *
89
-     * @return string
90
-     */
91
-    public function type()
92
-    {
93
-        return $this->get('STS_type');
94
-    }
95
-
96
-
97
-    /**
98
-     * Sets type
99
-     *
100
-     * @param string $type
101
-     * @return boolean
102
-     */
103
-    public function set_type($type)
104
-    {
105
-        $this->set('STS_type', $type);
106
-    }
107
-
108
-
109
-    /**
110
-     * Gets can_edit
111
-     *
112
-     * @return boolean
113
-     */
114
-    public function can_edit()
115
-    {
116
-        return $this->get('STS_can_edit');
117
-    }
118
-
119
-
120
-    /**
121
-     * Sets can_edit
122
-     *
123
-     * @param boolean $can_edit
124
-     * @return boolean
125
-     */
126
-    public function set_can_edit($can_edit)
127
-    {
128
-        $this->set('STS_can_edit', $can_edit);
129
-    }
130
-
131
-
132
-    /**
133
-     * Gets open
134
-     *
135
-     * @return boolean
136
-     */
137
-    public function open()
138
-    {
139
-        return $this->get('STS_open');
140
-    }
141
-
142
-
143
-    /**
144
-     * Sets open
145
-     *
146
-     * @param boolean $open
147
-     * @return boolean
148
-     */
149
-    public function set_open($open)
150
-    {
151
-        $this->set('STS_open', $open);
152
-    }
15
+	/**
16
+	 * @param array $props_n_values
17
+	 * @return EE_Status
18
+	 */
19
+	public static function new_instance($props_n_values = array())
20
+	{
21
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
22
+		return $has_object ? $has_object : new self($props_n_values);
23
+	}
24
+
25
+
26
+	/**
27
+	 * @param array $props_n_values
28
+	 * @return EE_Status
29
+	 */
30
+	public static function new_instance_from_db($props_n_values = array())
31
+	{
32
+		return new self($props_n_values, true);
33
+	}
34
+
35
+
36
+	/**
37
+	 * Gets code
38
+	 *
39
+	 * @param bool   $plural
40
+	 * @param string $schema
41
+	 * @return string
42
+	 */
43
+	public function code($plural = false, $schema = 'upper')
44
+	{
45
+		$id = $this->get('STS_ID');
46
+		$code = EEM_Status::instance()->localized_status(array($id => $this->get('STS_code')), $plural, $schema);
47
+		return $code[ $id ];
48
+	}
49
+
50
+
51
+	/**
52
+	 * Sets code
53
+	 *
54
+	 * @param string $code
55
+	 * @return boolean
56
+	 */
57
+	public function set_code($code)
58
+	{
59
+		$this->set('STS_code', $code);
60
+	}
61
+
62
+
63
+	/**
64
+	 * Gets desc
65
+	 *
66
+	 * @return string
67
+	 */
68
+	public function desc()
69
+	{
70
+		return $this->get('STS_desc');
71
+	}
72
+
73
+
74
+	/**
75
+	 * Sets desc
76
+	 *
77
+	 * @param string $desc
78
+	 * @return boolean
79
+	 */
80
+	public function set_desc($desc)
81
+	{
82
+		$this->set('STS_desc', $desc);
83
+	}
84
+
85
+
86
+	/**
87
+	 * Gets type
88
+	 *
89
+	 * @return string
90
+	 */
91
+	public function type()
92
+	{
93
+		return $this->get('STS_type');
94
+	}
95
+
96
+
97
+	/**
98
+	 * Sets type
99
+	 *
100
+	 * @param string $type
101
+	 * @return boolean
102
+	 */
103
+	public function set_type($type)
104
+	{
105
+		$this->set('STS_type', $type);
106
+	}
107
+
108
+
109
+	/**
110
+	 * Gets can_edit
111
+	 *
112
+	 * @return boolean
113
+	 */
114
+	public function can_edit()
115
+	{
116
+		return $this->get('STS_can_edit');
117
+	}
118
+
119
+
120
+	/**
121
+	 * Sets can_edit
122
+	 *
123
+	 * @param boolean $can_edit
124
+	 * @return boolean
125
+	 */
126
+	public function set_can_edit($can_edit)
127
+	{
128
+		$this->set('STS_can_edit', $can_edit);
129
+	}
130
+
131
+
132
+	/**
133
+	 * Gets open
134
+	 *
135
+	 * @return boolean
136
+	 */
137
+	public function open()
138
+	{
139
+		return $this->get('STS_open');
140
+	}
141
+
142
+
143
+	/**
144
+	 * Sets open
145
+	 *
146
+	 * @param boolean $open
147
+	 * @return boolean
148
+	 */
149
+	public function set_open($open)
150
+	{
151
+		$this->set('STS_open', $open);
152
+	}
153 153
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -44,7 +44,7 @@
 block discarded – undo
44 44
     {
45 45
         $id = $this->get('STS_ID');
46 46
         $code = EEM_Status::instance()->localized_status(array($id => $this->get('STS_code')), $plural, $schema);
47
-        return $code[ $id ];
47
+        return $code[$id];
48 48
     }
49 49
 
50 50
 
Please login to merge, or discard this patch.
core/db_classes/EE_Term.class.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -66,7 +66,7 @@  discard block
 block discarded – undo
66 66
      * Sets name
67 67
      *
68 68
      * @param string $name
69
-     * @return boolean
69
+     * @return boolean|null
70 70
      */
71 71
     public function set_name($name)
72 72
     {
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
      * Sets slug
90 90
      *
91 91
      * @param string $slug
92
-     * @return boolean
92
+     * @return boolean|null
93 93
      */
94 94
     public function set_slug($slug)
95 95
     {
Please login to merge, or discard this patch.
Indentation   +70 added lines, -70 removed lines patch added patch discarded remove patch
@@ -12,87 +12,87 @@
 block discarded – undo
12 12
 class EE_Term extends EE_Base_Class
13 13
 {
14 14
 
15
-    public $post_type;
15
+	public $post_type;
16 16
 
17
-    /**
18
-     * Sets some dynamic defaults
19
-     *
20
-     * @param array  $fieldValues
21
-     * @param bool   $bydb
22
-     * @param string $timezone
23
-     */
24
-    protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25
-    {
26
-        if (! isset($fieldValues['slug'])) {
27
-            $fieldValues['slug'] = $fieldValues['name'];
28
-        }
29
-        parent::__construct($fieldValues, $bydb, $timezone);
30
-    }
17
+	/**
18
+	 * Sets some dynamic defaults
19
+	 *
20
+	 * @param array  $fieldValues
21
+	 * @param bool   $bydb
22
+	 * @param string $timezone
23
+	 */
24
+	protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25
+	{
26
+		if (! isset($fieldValues['slug'])) {
27
+			$fieldValues['slug'] = $fieldValues['name'];
28
+		}
29
+		parent::__construct($fieldValues, $bydb, $timezone);
30
+	}
31 31
 
32 32
 
33
-    /**
34
-     * @param array $props_n_values
35
-     * @return EE_Term|mixed
36
-     */
37
-    public static function new_instance($props_n_values = array())
38
-    {
39
-        $has_object = parent::_check_for_object($props_n_values, __CLASS__);
40
-        return $has_object ? $has_object : new self($props_n_values);
41
-    }
33
+	/**
34
+	 * @param array $props_n_values
35
+	 * @return EE_Term|mixed
36
+	 */
37
+	public static function new_instance($props_n_values = array())
38
+	{
39
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__);
40
+		return $has_object ? $has_object : new self($props_n_values);
41
+	}
42 42
 
43 43
 
44
-    /**
45
-     * @param array $props_n_values
46
-     * @return EE_Term
47
-     */
48
-    public static function new_instance_from_db($props_n_values = array())
49
-    {
50
-        return new self($props_n_values, true);
51
-    }
44
+	/**
45
+	 * @param array $props_n_values
46
+	 * @return EE_Term
47
+	 */
48
+	public static function new_instance_from_db($props_n_values = array())
49
+	{
50
+		return new self($props_n_values, true);
51
+	}
52 52
 
53 53
 
54
-    /**
55
-     * Gets name
56
-     *
57
-     * @return string
58
-     */
59
-    public function name()
60
-    {
61
-        return $this->get('name');
62
-    }
54
+	/**
55
+	 * Gets name
56
+	 *
57
+	 * @return string
58
+	 */
59
+	public function name()
60
+	{
61
+		return $this->get('name');
62
+	}
63 63
 
64 64
 
65
-    /**
66
-     * Sets name
67
-     *
68
-     * @param string $name
69
-     * @return boolean
70
-     */
71
-    public function set_name($name)
72
-    {
73
-        $this->set('name', $name);
74
-    }
65
+	/**
66
+	 * Sets name
67
+	 *
68
+	 * @param string $name
69
+	 * @return boolean
70
+	 */
71
+	public function set_name($name)
72
+	{
73
+		$this->set('name', $name);
74
+	}
75 75
 
76 76
 
77
-    /**
78
-     * Gets slug
79
-     *
80
-     * @return string
81
-     */
82
-    public function slug()
83
-    {
84
-        return $this->get('slug');
85
-    }
77
+	/**
78
+	 * Gets slug
79
+	 *
80
+	 * @return string
81
+	 */
82
+	public function slug()
83
+	{
84
+		return $this->get('slug');
85
+	}
86 86
 
87 87
 
88
-    /**
89
-     * Sets slug
90
-     *
91
-     * @param string $slug
92
-     * @return boolean
93
-     */
94
-    public function set_slug($slug)
95
-    {
96
-        $this->set('slug', $slug);
97
-    }
88
+	/**
89
+	 * Sets slug
90
+	 *
91
+	 * @param string $slug
92
+	 * @return boolean
93
+	 */
94
+	public function set_slug($slug)
95
+	{
96
+		$this->set('slug', $slug);
97
+	}
98 98
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@
 block discarded – undo
23 23
      */
24 24
     protected function __construct($fieldValues = array(), $bydb = false, $timezone = '')
25 25
     {
26
-        if (! isset($fieldValues['slug'])) {
26
+        if ( ! isset($fieldValues['slug'])) {
27 27
             $fieldValues['slug'] = $fieldValues['name'];
28 28
         }
29 29
         parent::__construct($fieldValues, $bydb, $timezone);
Please login to merge, or discard this patch.