@@ -1,5 +1,5 @@ discard block |
||
| 1 | 1 | <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
| 2 | - exit('No direct script access allowed'); |
|
| 2 | + exit('No direct script access allowed'); |
|
| 3 | 3 | } |
| 4 | 4 | do_action('AHEE_log', __FILE__, ' FILE LOADED', ''); |
| 5 | 5 | |
@@ -25,2655 +25,2655 @@ discard block |
||
| 25 | 25 | abstract class EE_Base_Class |
| 26 | 26 | { |
| 27 | 27 | |
| 28 | - /** |
|
| 29 | - * This is an array of the original properties and values provided during construction |
|
| 30 | - * of this model object. (keys are model field names, values are their values). |
|
| 31 | - * This list is important to remember so that when we are merging data from the db, we know |
|
| 32 | - * which values to override and which to not override. |
|
| 33 | - * |
|
| 34 | - * @var array |
|
| 35 | - */ |
|
| 36 | - protected $_props_n_values_provided_in_constructor; |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * Timezone |
|
| 40 | - * This gets set by the "set_timezone()" method so that we know what timezone incoming strings|timestamps are in. |
|
| 41 | - * This can also be used before a get to set what timezone you want strings coming out of the object to be in. NOT |
|
| 42 | - * all EE_Base_Class child classes use this property but any that use a EE_Datetime_Field data type will have |
|
| 43 | - * access to it. |
|
| 44 | - * |
|
| 45 | - * @var string |
|
| 46 | - */ |
|
| 47 | - protected $_timezone; |
|
| 48 | - |
|
| 49 | - |
|
| 50 | - |
|
| 51 | - /** |
|
| 52 | - * date format |
|
| 53 | - * pattern or format for displaying dates |
|
| 54 | - * |
|
| 55 | - * @var string $_dt_frmt |
|
| 56 | - */ |
|
| 57 | - protected $_dt_frmt; |
|
| 58 | - |
|
| 59 | - |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * time format |
|
| 63 | - * pattern or format for displaying time |
|
| 64 | - * |
|
| 65 | - * @var string $_tm_frmt |
|
| 66 | - */ |
|
| 67 | - protected $_tm_frmt; |
|
| 68 | - |
|
| 69 | - |
|
| 70 | - |
|
| 71 | - /** |
|
| 72 | - * This property is for holding a cached array of object properties indexed by property name as the key. |
|
| 73 | - * The purpose of this is for setting a cache on properties that may have calculated values after a |
|
| 74 | - * prepare_for_get. That way the cache can be checked first and the calculated property returned instead of having |
|
| 75 | - * to recalculate. Used by _set_cached_property() and _get_cached_property() methods. |
|
| 76 | - * |
|
| 77 | - * @var array |
|
| 78 | - */ |
|
| 79 | - protected $_cached_properties = array(); |
|
| 80 | - |
|
| 81 | - /** |
|
| 82 | - * An array containing keys of the related model, and values are either an array of related mode objects or a |
|
| 83 | - * single |
|
| 84 | - * related model object. see the model's _model_relations. The keys should match those specified. And if the |
|
| 85 | - * relation is of type EE_Belongs_To (or one of its children), then there should only be ONE related model object, |
|
| 86 | - * all others have an array) |
|
| 87 | - * |
|
| 88 | - * @var array |
|
| 89 | - */ |
|
| 90 | - protected $_model_relations = array(); |
|
| 91 | - |
|
| 92 | - /** |
|
| 93 | - * Array where keys are field names (see the model's _fields property) and values are their values. To see what |
|
| 94 | - * their types should be, look at what that field object returns on its prepare_for_get and prepare_for_set methods) |
|
| 95 | - * |
|
| 96 | - * @var array |
|
| 97 | - */ |
|
| 98 | - protected $_fields = array(); |
|
| 99 | - |
|
| 100 | - /** |
|
| 101 | - * @var boolean indicating whether or not this model object is intended to ever be saved |
|
| 102 | - * For example, we might create model objects intended to only be used for the duration |
|
| 103 | - * of this request and to be thrown away, and if they were accidentally saved |
|
| 104 | - * it would be a bug. |
|
| 105 | - */ |
|
| 106 | - protected $_allow_persist = true; |
|
| 107 | - |
|
| 108 | - |
|
| 109 | - |
|
| 110 | - /** |
|
| 111 | - * basic constructor for Event Espresso classes, performs any necessary initialization, and verifies it's children |
|
| 112 | - * play nice |
|
| 113 | - * |
|
| 114 | - * @param array $fieldValues where each key is a field (ie, array key in the 2nd |
|
| 115 | - * layer of the model's _fields array, (eg, EVT_ID, |
|
| 116 | - * TXN_amount, QST_name, etc) and values are their values |
|
| 117 | - * @param boolean $bydb a flag for setting if the class is instantiated by the |
|
| 118 | - * corresponding db model or not. |
|
| 119 | - * @param string $timezone indicate what timezone you want any datetime fields to |
|
| 120 | - * be in when instantiating a EE_Base_Class object. |
|
| 121 | - * @param array $date_formats An array of date formats to set on construct where first |
|
| 122 | - * value is the date_format and second value is the time |
|
| 123 | - * format. |
|
| 124 | - * @throws EE_Error |
|
| 125 | - */ |
|
| 126 | - protected function __construct($fieldValues = array(), $bydb = false, $timezone = '', $date_formats = array()) |
|
| 127 | - { |
|
| 128 | - $className = get_class($this); |
|
| 129 | - do_action("AHEE__{$className}__construct", $this, $fieldValues); |
|
| 130 | - $model = $this->get_model(); |
|
| 131 | - $model_fields = $model->field_settings(false); |
|
| 132 | - // ensure $fieldValues is an array |
|
| 133 | - $fieldValues = is_array($fieldValues) ? $fieldValues : array($fieldValues); |
|
| 134 | - // EEH_Debug_Tools::printr( $fieldValues, '$fieldValues <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' ); |
|
| 135 | - // verify client code has not passed any invalid field names |
|
| 136 | - foreach ($fieldValues as $field_name => $field_value) { |
|
| 137 | - if ( ! isset($model_fields[$field_name])) { |
|
| 138 | - throw new EE_Error(sprintf(__("Invalid field (%s) passed to constructor of %s. Allowed fields are :%s", |
|
| 139 | - "event_espresso"), $field_name, get_class($this), implode(", ", array_keys($model_fields)))); |
|
| 140 | - } |
|
| 141 | - } |
|
| 142 | - // EEH_Debug_Tools::printr( $model_fields, '$model_fields <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' ); |
|
| 143 | - $this->_timezone = EEH_DTT_Helper::get_valid_timezone_string($timezone); |
|
| 144 | - if ( ! empty($date_formats) && is_array($date_formats)) { |
|
| 145 | - list($this->_dt_frmt, $this->_tm_frmt) = $date_formats; |
|
| 146 | - } else { |
|
| 147 | - //set default formats for date and time |
|
| 148 | - $this->_dt_frmt = (string)get_option('date_format', 'Y-m-d'); |
|
| 149 | - $this->_tm_frmt = (string)get_option('time_format', 'g:i a'); |
|
| 150 | - } |
|
| 151 | - //if db model is instantiating |
|
| 152 | - if ($bydb) { |
|
| 153 | - //client code has indicated these field values are from the database |
|
| 154 | - foreach ($model_fields as $fieldName => $field) { |
|
| 155 | - $this->set_from_db($fieldName, isset($fieldValues[$fieldName]) ? $fieldValues[$fieldName] : null); |
|
| 156 | - } |
|
| 157 | - } else { |
|
| 158 | - //we're constructing a brand |
|
| 159 | - //new instance of the model object. Generally, this means we'll need to do more field validation |
|
| 160 | - foreach ($model_fields as $fieldName => $field) { |
|
| 161 | - $this->set($fieldName, isset($fieldValues[$fieldName]) ? $fieldValues[$fieldName] : null, true); |
|
| 162 | - } |
|
| 163 | - } |
|
| 164 | - //remember what values were passed to this constructor |
|
| 165 | - $this->_props_n_values_provided_in_constructor = $fieldValues; |
|
| 166 | - //remember in entity mapper |
|
| 167 | - if ( ! $bydb && $model->has_primary_key_field() && $this->ID()) { |
|
| 168 | - $model->add_to_entity_map($this); |
|
| 169 | - } |
|
| 170 | - //setup all the relations |
|
| 171 | - foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 172 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 173 | - $this->_model_relations[$relation_name] = null; |
|
| 174 | - } else { |
|
| 175 | - $this->_model_relations[$relation_name] = array(); |
|
| 176 | - } |
|
| 177 | - } |
|
| 178 | - /** |
|
| 179 | - * Action done at the end of each model object construction |
|
| 180 | - * |
|
| 181 | - * @param EE_Base_Class $this the model object just created |
|
| 182 | - */ |
|
| 183 | - do_action('AHEE__EE_Base_Class__construct__finished', $this); |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - |
|
| 187 | - |
|
| 188 | - /** |
|
| 189 | - * Gets whether or not this model object is allowed to persist/be saved to the database. |
|
| 190 | - * |
|
| 191 | - * @return boolean |
|
| 192 | - */ |
|
| 193 | - public function allow_persist() |
|
| 194 | - { |
|
| 195 | - return $this->_allow_persist; |
|
| 196 | - } |
|
| 197 | - |
|
| 198 | - |
|
| 199 | - |
|
| 200 | - /** |
|
| 201 | - * Sets whether or not this model object should be allowed to be saved to the DB. |
|
| 202 | - * Normally once this is set to FALSE you wouldn't set it back to TRUE, unless |
|
| 203 | - * you got new information that somehow made you change your mind. |
|
| 204 | - * |
|
| 205 | - * @param boolean $allow_persist |
|
| 206 | - * @return boolean |
|
| 207 | - */ |
|
| 208 | - public function set_allow_persist($allow_persist) |
|
| 209 | - { |
|
| 210 | - return $this->_allow_persist = $allow_persist; |
|
| 211 | - } |
|
| 212 | - |
|
| 213 | - |
|
| 214 | - |
|
| 215 | - /** |
|
| 216 | - * Gets the field's original value when this object was constructed during this request. |
|
| 217 | - * This can be helpful when determining if a model object has changed or not |
|
| 218 | - * |
|
| 219 | - * @param string $field_name |
|
| 220 | - * @return mixed|null |
|
| 221 | - * @throws \EE_Error |
|
| 222 | - */ |
|
| 223 | - public function get_original($field_name) |
|
| 224 | - { |
|
| 225 | - if (isset($this->_props_n_values_provided_in_constructor[$field_name]) |
|
| 226 | - && $field_settings = $this->get_model()->field_settings_for($field_name) |
|
| 227 | - ) { |
|
| 228 | - return $field_settings->prepare_for_get($this->_props_n_values_provided_in_constructor[$field_name]); |
|
| 229 | - } else { |
|
| 230 | - return null; |
|
| 231 | - } |
|
| 232 | - } |
|
| 233 | - |
|
| 234 | - |
|
| 235 | - |
|
| 236 | - /** |
|
| 237 | - * @param EE_Base_Class $obj |
|
| 238 | - * @return string |
|
| 239 | - */ |
|
| 240 | - public function get_class($obj) |
|
| 241 | - { |
|
| 242 | - return get_class($obj); |
|
| 243 | - } |
|
| 244 | - |
|
| 245 | - |
|
| 246 | - |
|
| 247 | - /** |
|
| 248 | - * Overrides parent because parent expects old models. |
|
| 249 | - * This also doesn't do any validation, and won't work for serialized arrays |
|
| 250 | - * |
|
| 251 | - * @param string $field_name |
|
| 252 | - * @param mixed $field_value |
|
| 253 | - * @param bool $use_default |
|
| 254 | - * @throws \EE_Error |
|
| 255 | - */ |
|
| 256 | - public function set($field_name, $field_value, $use_default = false) |
|
| 257 | - { |
|
| 258 | - $field_obj = $this->get_model()->field_settings_for($field_name); |
|
| 259 | - if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 260 | - // if ( method_exists( $field_obj, 'set_timezone' )) { |
|
| 261 | - if ($field_obj instanceof EE_Datetime_Field) { |
|
| 262 | - $field_obj->set_timezone($this->_timezone); |
|
| 263 | - $field_obj->set_date_format($this->_dt_frmt); |
|
| 264 | - $field_obj->set_time_format($this->_tm_frmt); |
|
| 265 | - } |
|
| 266 | - $holder_of_value = $field_obj->prepare_for_set($field_value); |
|
| 267 | - //should the value be null? |
|
| 268 | - if (($field_value === null || $holder_of_value === null || $holder_of_value === '') && $use_default) { |
|
| 269 | - $this->_fields[$field_name] = $field_obj->get_default_value(); |
|
| 270 | - /** |
|
| 271 | - * To save having to refactor all the models, if a default value is used for a |
|
| 272 | - * EE_Datetime_Field, and that value is not null nor is it a DateTime |
|
| 273 | - * object. Then let's do a set again to ensure that it becomes a DateTime |
|
| 274 | - * object. |
|
| 275 | - * |
|
| 276 | - * @since 4.6.10+ |
|
| 277 | - */ |
|
| 278 | - if ( |
|
| 279 | - $field_obj instanceof EE_Datetime_Field |
|
| 280 | - && $this->_fields[$field_name] !== null |
|
| 281 | - && ! $this->_fields[$field_name] instanceof DateTime |
|
| 282 | - ) { |
|
| 283 | - empty($this->_fields[$field_name]) |
|
| 284 | - ? $this->set($field_name, time()) |
|
| 285 | - : $this->set($field_name, $this->_fields[$field_name]); |
|
| 286 | - } |
|
| 287 | - } else { |
|
| 288 | - $this->_fields[$field_name] = $holder_of_value; |
|
| 289 | - } |
|
| 290 | - //if we're not in the constructor... |
|
| 291 | - //now check if what we set was a primary key |
|
| 292 | - if ( |
|
| 293 | - //note: props_n_values_provided_in_constructor is only set at the END of the constructor |
|
| 294 | - $this->_props_n_values_provided_in_constructor |
|
| 295 | - && $field_value |
|
| 296 | - && $field_name === self::_get_primary_key_name(get_class($this)) |
|
| 297 | - ) { |
|
| 298 | - //if so, we want all this object's fields to be filled either with |
|
| 299 | - //what we've explicitly set on this model |
|
| 300 | - //or what we have in the db |
|
| 301 | - // echo "setting primary key!"; |
|
| 302 | - $fields_on_model = self::_get_model(get_class($this))->field_settings(); |
|
| 303 | - $obj_in_db = self::_get_model(get_class($this))->get_one_by_ID($field_value); |
|
| 304 | - foreach ($fields_on_model as $field_obj) { |
|
| 305 | - if ( ! array_key_exists($field_obj->get_name(), $this->_props_n_values_provided_in_constructor) |
|
| 306 | - && $field_obj->get_name() !== $field_name |
|
| 307 | - ) { |
|
| 308 | - $this->set($field_obj->get_name(), $obj_in_db->get($field_obj->get_name())); |
|
| 309 | - } |
|
| 310 | - } |
|
| 311 | - //oh this model object has an ID? well make sure its in the entity mapper |
|
| 312 | - $this->get_model()->add_to_entity_map($this); |
|
| 313 | - } |
|
| 314 | - //let's unset any cache for this field_name from the $_cached_properties property. |
|
| 315 | - $this->_clear_cached_property($field_name); |
|
| 316 | - } else { |
|
| 317 | - throw new EE_Error(sprintf(__("A valid EE_Model_Field_Base could not be found for the given field name: %s", |
|
| 318 | - "event_espresso"), $field_name)); |
|
| 319 | - } |
|
| 320 | - } |
|
| 321 | - |
|
| 322 | - |
|
| 323 | - |
|
| 324 | - /** |
|
| 325 | - * This sets the field value on the db column if it exists for the given $column_name or |
|
| 326 | - * saves it to EE_Extra_Meta if the given $column_name does not match a db column. |
|
| 327 | - * |
|
| 328 | - * @see EE_message::get_column_value for related documentation on the necessity of this method. |
|
| 329 | - * @param string $field_name Must be the exact column name. |
|
| 330 | - * @param mixed $field_value The value to set. |
|
| 331 | - * @return int|bool @see EE_Base_Class::update_extra_meta() for return docs. |
|
| 332 | - * @throws \EE_Error |
|
| 333 | - */ |
|
| 334 | - public function set_field_or_extra_meta($field_name, $field_value) |
|
| 335 | - { |
|
| 336 | - if ($this->get_model()->has_field($field_name)) { |
|
| 337 | - $this->set($field_name, $field_value); |
|
| 338 | - return true; |
|
| 339 | - } else { |
|
| 340 | - //ensure this object is saved first so that extra meta can be properly related. |
|
| 341 | - $this->save(); |
|
| 342 | - return $this->update_extra_meta($field_name, $field_value); |
|
| 343 | - } |
|
| 344 | - } |
|
| 345 | - |
|
| 346 | - |
|
| 347 | - |
|
| 348 | - /** |
|
| 349 | - * This retrieves the value of the db column set on this class or if that's not present |
|
| 350 | - * it will attempt to retrieve from extra_meta if found. |
|
| 351 | - * Example Usage: |
|
| 352 | - * Via EE_Message child class: |
|
| 353 | - * Due to the dynamic nature of the EE_messages system, EE_messengers will always have a "to", |
|
| 354 | - * "from", "subject", and "content" field (as represented in the EE_Message schema), however they may |
|
| 355 | - * also have additional main fields specific to the messenger. The system accommodates those extra |
|
| 356 | - * fields through the EE_Extra_Meta table. This method allows for EE_messengers to retrieve the |
|
| 357 | - * value for those extra fields dynamically via the EE_message object. |
|
| 358 | - * |
|
| 359 | - * @param string $field_name expecting the fully qualified field name. |
|
| 360 | - * @return mixed|null value for the field if found. null if not found. |
|
| 361 | - * @throws \EE_Error |
|
| 362 | - */ |
|
| 363 | - public function get_field_or_extra_meta($field_name) |
|
| 364 | - { |
|
| 365 | - if ($this->get_model()->has_field($field_name)) { |
|
| 366 | - $column_value = $this->get($field_name); |
|
| 367 | - } else { |
|
| 368 | - //This isn't a column in the main table, let's see if it is in the extra meta. |
|
| 369 | - $column_value = $this->get_extra_meta($field_name, true, null); |
|
| 370 | - } |
|
| 371 | - return $column_value; |
|
| 372 | - } |
|
| 373 | - |
|
| 374 | - |
|
| 375 | - |
|
| 376 | - /** |
|
| 377 | - * See $_timezone property for description of what the timezone property is for. This SETS the timezone internally |
|
| 378 | - * for being able to reference what timezone we are running conversions on when converting TO the internal timezone |
|
| 379 | - * (UTC Unix Timestamp) for the object OR when converting FROM the internal timezone (UTC Unix Timestamp). This is |
|
| 380 | - * available to all child classes that may be using the EE_Datetime_Field for a field data type. |
|
| 381 | - * |
|
| 382 | - * @access public |
|
| 383 | - * @param string $timezone A valid timezone string as described by @link http://www.php.net/manual/en/timezones.php |
|
| 384 | - * @return void |
|
| 385 | - * @throws \EE_Error |
|
| 386 | - */ |
|
| 387 | - public function set_timezone($timezone = '') |
|
| 388 | - { |
|
| 389 | - $this->_timezone = EEH_DTT_Helper::get_valid_timezone_string($timezone); |
|
| 390 | - //make sure we clear all cached properties because they won't be relevant now |
|
| 391 | - $this->_clear_cached_properties(); |
|
| 392 | - //make sure we update field settings and the date for all EE_Datetime_Fields |
|
| 393 | - $model_fields = $this->get_model()->field_settings(false); |
|
| 394 | - foreach ($model_fields as $field_name => $field_obj) { |
|
| 395 | - if ($field_obj instanceof EE_Datetime_Field) { |
|
| 396 | - $field_obj->set_timezone($this->_timezone); |
|
| 397 | - if (isset($this->_fields[$field_name]) && $this->_fields[$field_name] instanceof DateTime) { |
|
| 398 | - $this->_fields[$field_name]->setTimezone(new DateTimeZone($this->_timezone)); |
|
| 399 | - } |
|
| 400 | - } |
|
| 401 | - } |
|
| 402 | - } |
|
| 403 | - |
|
| 404 | - |
|
| 405 | - |
|
| 406 | - /** |
|
| 407 | - * This just returns whatever is set for the current timezone. |
|
| 408 | - * |
|
| 409 | - * @access public |
|
| 410 | - * @return string timezone string |
|
| 411 | - */ |
|
| 412 | - public function get_timezone() |
|
| 413 | - { |
|
| 414 | - return $this->_timezone; |
|
| 415 | - } |
|
| 416 | - |
|
| 417 | - |
|
| 418 | - |
|
| 419 | - /** |
|
| 420 | - * This sets the internal date format to what is sent in to be used as the new default for the class |
|
| 421 | - * internally instead of wp set date format options |
|
| 422 | - * |
|
| 423 | - * @since 4.6 |
|
| 424 | - * @param string $format should be a format recognizable by PHP date() functions. |
|
| 425 | - */ |
|
| 426 | - public function set_date_format($format) |
|
| 427 | - { |
|
| 428 | - $this->_dt_frmt = $format; |
|
| 429 | - //clear cached_properties because they won't be relevant now. |
|
| 430 | - $this->_clear_cached_properties(); |
|
| 431 | - } |
|
| 432 | - |
|
| 433 | - |
|
| 434 | - |
|
| 435 | - /** |
|
| 436 | - * This sets the internal time format string to what is sent in to be used as the new default for the |
|
| 437 | - * class internally instead of wp set time format options. |
|
| 438 | - * |
|
| 439 | - * @since 4.6 |
|
| 440 | - * @param string $format should be a format recognizable by PHP date() functions. |
|
| 441 | - */ |
|
| 442 | - public function set_time_format($format) |
|
| 443 | - { |
|
| 444 | - $this->_tm_frmt = $format; |
|
| 445 | - //clear cached_properties because they won't be relevant now. |
|
| 446 | - $this->_clear_cached_properties(); |
|
| 447 | - } |
|
| 448 | - |
|
| 449 | - |
|
| 450 | - |
|
| 451 | - /** |
|
| 452 | - * This returns the current internal set format for the date and time formats. |
|
| 453 | - * |
|
| 454 | - * @param bool $full if true (default), then return the full format. Otherwise will return an array |
|
| 455 | - * where the first value is the date format and the second value is the time format. |
|
| 456 | - * @return mixed string|array |
|
| 457 | - */ |
|
| 458 | - public function get_format($full = true) |
|
| 459 | - { |
|
| 460 | - return $full ? $this->_dt_frmt . ' ' . $this->_tm_frmt : array($this->_dt_frmt, $this->_tm_frmt); |
|
| 461 | - } |
|
| 462 | - |
|
| 463 | - |
|
| 464 | - |
|
| 465 | - /** |
|
| 466 | - * cache |
|
| 467 | - * stores the passed model object on the current model object. |
|
| 468 | - * In certain circumstances, we can use this cached model object instead of querying for another one entirely. |
|
| 469 | - * |
|
| 470 | - * @param string $relationName one of the keys in the _model_relations array on the model. Eg |
|
| 471 | - * 'Registration' associated with this model object |
|
| 472 | - * @param EE_Base_Class $object_to_cache that has a relation to this model object. (Eg, if this is a Transaction, |
|
| 473 | - * that could be a payment or a registration) |
|
| 474 | - * @param null $cache_id a string or number that will be used as the key for any Belongs_To_Many |
|
| 475 | - * items which will be stored in an array on this object |
|
| 476 | - * @throws EE_Error |
|
| 477 | - * @return mixed index into cache, or just TRUE if the relation is of type Belongs_To (because there's only one |
|
| 478 | - * related thing, no array) |
|
| 479 | - */ |
|
| 480 | - public function cache($relationName = '', $object_to_cache = null, $cache_id = null) |
|
| 481 | - { |
|
| 482 | - // its entirely possible that there IS no related object yet in which case there is nothing to cache. |
|
| 483 | - if ( ! $object_to_cache instanceof EE_Base_Class) { |
|
| 484 | - return false; |
|
| 485 | - } |
|
| 486 | - // also get "how" the object is related, or throw an error |
|
| 487 | - if ( ! $relationship_to_model = $this->get_model()->related_settings_for($relationName)) { |
|
| 488 | - throw new EE_Error(sprintf(__('There is no relationship to %s on a %s. Cannot cache it', 'event_espresso'), |
|
| 489 | - $relationName, get_class($this))); |
|
| 490 | - } |
|
| 491 | - // how many things are related ? |
|
| 492 | - if ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 493 | - // if it's a "belongs to" relationship, then there's only one related model object eg, if this is a registration, there's only 1 attendee for it |
|
| 494 | - // so for these model objects just set it to be cached |
|
| 495 | - $this->_model_relations[$relationName] = $object_to_cache; |
|
| 496 | - $return = true; |
|
| 497 | - } else { |
|
| 498 | - // otherwise, this is the "many" side of a one to many relationship, so we'll add the object to the array of related objects for that type. |
|
| 499 | - // eg: if this is an event, there are many registrations for that event, so we cache the registrations in an array |
|
| 500 | - if ( ! is_array($this->_model_relations[$relationName])) { |
|
| 501 | - // if for some reason, the cached item is a model object, then stick that in the array, otherwise start with an empty array |
|
| 502 | - $this->_model_relations[$relationName] = $this->_model_relations[$relationName] instanceof EE_Base_Class |
|
| 503 | - ? array($this->_model_relations[$relationName]) : array(); |
|
| 504 | - } |
|
| 505 | - // first check for a cache_id which is normally empty |
|
| 506 | - if ( ! empty($cache_id)) { |
|
| 507 | - // if the cache_id exists, then it means we are purposely trying to cache this with a known key that can then be used to retrieve the object later on |
|
| 508 | - $this->_model_relations[$relationName][$cache_id] = $object_to_cache; |
|
| 509 | - $return = $cache_id; |
|
| 510 | - } elseif ($object_to_cache->ID()) { |
|
| 511 | - // OR the cached object originally came from the db, so let's just use it's PK for an ID |
|
| 512 | - $this->_model_relations[$relationName][$object_to_cache->ID()] = $object_to_cache; |
|
| 513 | - $return = $object_to_cache->ID(); |
|
| 514 | - } else { |
|
| 515 | - // OR it's a new object with no ID, so just throw it in the array with an auto-incremented ID |
|
| 516 | - $this->_model_relations[$relationName][] = $object_to_cache; |
|
| 517 | - // move the internal pointer to the end of the array |
|
| 518 | - end($this->_model_relations[$relationName]); |
|
| 519 | - // and grab the key so that we can return it |
|
| 520 | - $return = key($this->_model_relations[$relationName]); |
|
| 521 | - } |
|
| 522 | - } |
|
| 523 | - return $return; |
|
| 524 | - } |
|
| 525 | - |
|
| 526 | - |
|
| 527 | - |
|
| 528 | - /** |
|
| 529 | - * For adding an item to the cached_properties property. |
|
| 530 | - * |
|
| 531 | - * @access protected |
|
| 532 | - * @param string $fieldname the property item the corresponding value is for. |
|
| 533 | - * @param mixed $value The value we are caching. |
|
| 534 | - * @param string|null $cache_type |
|
| 535 | - * @return void |
|
| 536 | - * @throws \EE_Error |
|
| 537 | - */ |
|
| 538 | - protected function _set_cached_property($fieldname, $value, $cache_type = null) |
|
| 539 | - { |
|
| 540 | - //first make sure this property exists |
|
| 541 | - $this->get_model()->field_settings_for($fieldname); |
|
| 542 | - $cache_type = empty($cache_type) ? 'standard' : $cache_type; |
|
| 543 | - $this->_cached_properties[$fieldname][$cache_type] = $value; |
|
| 544 | - } |
|
| 545 | - |
|
| 546 | - |
|
| 547 | - |
|
| 548 | - /** |
|
| 549 | - * This returns the value cached property if it exists OR the actual property value if the cache doesn't exist. |
|
| 550 | - * This also SETS the cache if we return the actual property! |
|
| 551 | - * |
|
| 552 | - * @param string $fieldname the name of the property we're trying to retrieve |
|
| 553 | - * @param bool $pretty |
|
| 554 | - * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 555 | - * (in cases where the same property may be used for different outputs |
|
| 556 | - * - i.e. datetime, money etc.) |
|
| 557 | - * It can also accept certain pre-defined "schema" strings |
|
| 558 | - * to define how to output the property. |
|
| 559 | - * see the field's prepare_for_pretty_echoing for what strings can be used |
|
| 560 | - * @return mixed whatever the value for the property is we're retrieving |
|
| 561 | - * @throws \EE_Error |
|
| 562 | - */ |
|
| 563 | - protected function _get_cached_property($fieldname, $pretty = false, $extra_cache_ref = null) |
|
| 564 | - { |
|
| 565 | - //verify the field exists |
|
| 566 | - $this->get_model()->field_settings_for($fieldname); |
|
| 567 | - $cache_type = $pretty ? 'pretty' : 'standard'; |
|
| 568 | - $cache_type .= ! empty($extra_cache_ref) ? '_' . $extra_cache_ref : ''; |
|
| 569 | - if (isset($this->_cached_properties[$fieldname][$cache_type])) { |
|
| 570 | - return $this->_cached_properties[$fieldname][$cache_type]; |
|
| 571 | - } |
|
| 572 | - $field_obj = $this->get_model()->field_settings_for($fieldname); |
|
| 573 | - if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 574 | - // If this is an EE_Datetime_Field we need to make sure timezone, formats, and output are correct |
|
| 575 | - if ($field_obj instanceof EE_Datetime_Field) { |
|
| 576 | - $this->_prepare_datetime_field($field_obj, $pretty, $extra_cache_ref); |
|
| 577 | - } |
|
| 578 | - if ( ! isset($this->_fields[$fieldname])) { |
|
| 579 | - $this->_fields[$fieldname] = null; |
|
| 580 | - } |
|
| 581 | - $value = $pretty |
|
| 582 | - ? $field_obj->prepare_for_pretty_echoing($this->_fields[$fieldname], $extra_cache_ref) |
|
| 583 | - : $field_obj->prepare_for_get($this->_fields[$fieldname]); |
|
| 584 | - $this->_set_cached_property($fieldname, $value, $cache_type); |
|
| 585 | - return $value; |
|
| 586 | - } |
|
| 587 | - return null; |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - |
|
| 591 | - |
|
| 592 | - /** |
|
| 593 | - * set timezone, formats, and output for EE_Datetime_Field objects |
|
| 594 | - * |
|
| 595 | - * @param \EE_Datetime_Field $datetime_field |
|
| 596 | - * @param bool $pretty |
|
| 597 | - * @param null $date_or_time |
|
| 598 | - * @return void |
|
| 599 | - * @throws \EE_Error |
|
| 600 | - */ |
|
| 601 | - protected function _prepare_datetime_field( |
|
| 602 | - EE_Datetime_Field $datetime_field, |
|
| 603 | - $pretty = false, |
|
| 604 | - $date_or_time = null |
|
| 605 | - ) { |
|
| 606 | - $datetime_field->set_timezone($this->_timezone); |
|
| 607 | - $datetime_field->set_date_format($this->_dt_frmt, $pretty); |
|
| 608 | - $datetime_field->set_time_format($this->_tm_frmt, $pretty); |
|
| 609 | - //set the output returned |
|
| 610 | - switch ($date_or_time) { |
|
| 611 | - case 'D' : |
|
| 612 | - $datetime_field->set_date_time_output('date'); |
|
| 613 | - break; |
|
| 614 | - case 'T' : |
|
| 615 | - $datetime_field->set_date_time_output('time'); |
|
| 616 | - break; |
|
| 617 | - default : |
|
| 618 | - $datetime_field->set_date_time_output(); |
|
| 619 | - } |
|
| 620 | - } |
|
| 621 | - |
|
| 622 | - |
|
| 623 | - |
|
| 624 | - /** |
|
| 625 | - * This just takes care of clearing out the cached_properties |
|
| 626 | - * |
|
| 627 | - * @return void |
|
| 628 | - */ |
|
| 629 | - protected function _clear_cached_properties() |
|
| 630 | - { |
|
| 631 | - $this->_cached_properties = array(); |
|
| 632 | - } |
|
| 633 | - |
|
| 634 | - |
|
| 635 | - |
|
| 636 | - /** |
|
| 637 | - * This just clears out ONE property if it exists in the cache |
|
| 638 | - * |
|
| 639 | - * @param string $property_name the property to remove if it exists (from the _cached_properties array) |
|
| 640 | - * @return void |
|
| 641 | - */ |
|
| 642 | - protected function _clear_cached_property($property_name) |
|
| 643 | - { |
|
| 644 | - if (isset($this->_cached_properties[$property_name])) { |
|
| 645 | - unset($this->_cached_properties[$property_name]); |
|
| 646 | - } |
|
| 647 | - } |
|
| 648 | - |
|
| 649 | - |
|
| 650 | - |
|
| 651 | - /** |
|
| 652 | - * Ensures that this related thing is a model object. |
|
| 653 | - * |
|
| 654 | - * @param mixed $object_or_id EE_base_Class/int/string either a related model object, or its ID |
|
| 655 | - * @param string $model_name name of the related thing, eg 'Attendee', |
|
| 656 | - * @return EE_Base_Class |
|
| 657 | - * @throws \EE_Error |
|
| 658 | - */ |
|
| 659 | - protected function ensure_related_thing_is_model_obj($object_or_id, $model_name) |
|
| 660 | - { |
|
| 661 | - $other_model_instance = self::_get_model_instance_with_name( |
|
| 662 | - self::_get_model_classname($model_name), |
|
| 663 | - $this->_timezone |
|
| 664 | - ); |
|
| 665 | - return $other_model_instance->ensure_is_obj($object_or_id); |
|
| 666 | - } |
|
| 667 | - |
|
| 668 | - |
|
| 669 | - |
|
| 670 | - /** |
|
| 671 | - * Forgets the cached model of the given relation Name. So the next time we request it, |
|
| 672 | - * we will fetch it again from the database. (Handy if you know it's changed somehow). |
|
| 673 | - * If a specific object is supplied, and the relationship to it is either a HasMany or HABTM, |
|
| 674 | - * then only remove that one object from our cached array. Otherwise, clear the entire list |
|
| 675 | - * |
|
| 676 | - * @param string $relationName one of the keys in the _model_relations array on the model. |
|
| 677 | - * Eg 'Registration' |
|
| 678 | - * @param mixed $object_to_remove_or_index_into_array or an index into the array of cached things, or NULL |
|
| 679 | - * if you intend to use $clear_all = TRUE, or the relation only |
|
| 680 | - * has 1 object anyways (ie, it's a BelongsToRelation) |
|
| 681 | - * @param bool $clear_all This flags clearing the entire cache relation property if |
|
| 682 | - * this is HasMany or HABTM. |
|
| 683 | - * @throws EE_Error |
|
| 684 | - * @return EE_Base_Class | boolean from which was cleared from the cache, or true if we requested to remove a |
|
| 685 | - * relation from all |
|
| 686 | - */ |
|
| 687 | - public function clear_cache($relationName, $object_to_remove_or_index_into_array = null, $clear_all = false) |
|
| 688 | - { |
|
| 689 | - $relationship_to_model = $this->get_model()->related_settings_for($relationName); |
|
| 690 | - $index_in_cache = ''; |
|
| 691 | - if ( ! $relationship_to_model) { |
|
| 692 | - throw new EE_Error( |
|
| 693 | - sprintf( |
|
| 694 | - __("There is no relationship to %s on a %s. Cannot clear that cache", 'event_espresso'), |
|
| 695 | - $relationName, |
|
| 696 | - get_class($this) |
|
| 697 | - ) |
|
| 698 | - ); |
|
| 699 | - } |
|
| 700 | - if ($clear_all) { |
|
| 701 | - $obj_removed = true; |
|
| 702 | - $this->_model_relations[$relationName] = null; |
|
| 703 | - } elseif ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 704 | - $obj_removed = $this->_model_relations[$relationName]; |
|
| 705 | - $this->_model_relations[$relationName] = null; |
|
| 706 | - } else { |
|
| 707 | - if ($object_to_remove_or_index_into_array instanceof EE_Base_Class |
|
| 708 | - && $object_to_remove_or_index_into_array->ID() |
|
| 709 | - ) { |
|
| 710 | - $index_in_cache = $object_to_remove_or_index_into_array->ID(); |
|
| 711 | - if (is_array($this->_model_relations[$relationName]) |
|
| 712 | - && ! isset($this->_model_relations[$relationName][$index_in_cache]) |
|
| 713 | - ) { |
|
| 714 | - $index_found_at = null; |
|
| 715 | - //find this object in the array even though it has a different key |
|
| 716 | - foreach ($this->_model_relations[$relationName] as $index => $obj) { |
|
| 717 | - if ( |
|
| 718 | - $obj instanceof EE_Base_Class |
|
| 719 | - && ( |
|
| 720 | - $obj == $object_to_remove_or_index_into_array |
|
| 721 | - || $obj->ID() === $object_to_remove_or_index_into_array->ID() |
|
| 722 | - ) |
|
| 723 | - ) { |
|
| 724 | - $index_found_at = $index; |
|
| 725 | - break; |
|
| 726 | - } |
|
| 727 | - } |
|
| 728 | - if ($index_found_at) { |
|
| 729 | - $index_in_cache = $index_found_at; |
|
| 730 | - } else { |
|
| 731 | - //it wasn't found. huh. well obviously it doesn't need to be removed from teh cache |
|
| 732 | - //if it wasn't in it to begin with. So we're done |
|
| 733 | - return $object_to_remove_or_index_into_array; |
|
| 734 | - } |
|
| 735 | - } |
|
| 736 | - } elseif ($object_to_remove_or_index_into_array instanceof EE_Base_Class) { |
|
| 737 | - //so they provided a model object, but it's not yet saved to the DB... so let's go hunting for it! |
|
| 738 | - foreach ($this->get_all_from_cache($relationName) as $index => $potentially_obj_we_want) { |
|
| 739 | - if ($potentially_obj_we_want == $object_to_remove_or_index_into_array) { |
|
| 740 | - $index_in_cache = $index; |
|
| 741 | - } |
|
| 742 | - } |
|
| 743 | - } else { |
|
| 744 | - $index_in_cache = $object_to_remove_or_index_into_array; |
|
| 745 | - } |
|
| 746 | - //supposedly we've found it. But it could just be that the client code |
|
| 747 | - //provided a bad index/object |
|
| 748 | - if ( |
|
| 749 | - isset( |
|
| 750 | - $this->_model_relations[$relationName], |
|
| 751 | - $this->_model_relations[$relationName][$index_in_cache] |
|
| 752 | - ) |
|
| 753 | - ) { |
|
| 754 | - $obj_removed = $this->_model_relations[$relationName][$index_in_cache]; |
|
| 755 | - unset($this->_model_relations[$relationName][$index_in_cache]); |
|
| 756 | - } else { |
|
| 757 | - //that thing was never cached anyways. |
|
| 758 | - $obj_removed = null; |
|
| 759 | - } |
|
| 760 | - } |
|
| 761 | - return $obj_removed; |
|
| 762 | - } |
|
| 763 | - |
|
| 764 | - |
|
| 765 | - |
|
| 766 | - /** |
|
| 767 | - * update_cache_after_object_save |
|
| 768 | - * Allows a cached item to have it's cache ID (within the array of cached items) reset using the new ID it has |
|
| 769 | - * obtained after being saved to the db |
|
| 770 | - * |
|
| 771 | - * @param string $relationName - the type of object that is cached |
|
| 772 | - * @param \EE_Base_Class $newly_saved_object - the newly saved object to be re-cached |
|
| 773 | - * @param string $current_cache_id - the ID that was used when originally caching the object |
|
| 774 | - * @return boolean TRUE on success, FALSE on fail |
|
| 775 | - * @throws \EE_Error |
|
| 776 | - */ |
|
| 777 | - public function update_cache_after_object_save( |
|
| 778 | - $relationName, |
|
| 779 | - EE_Base_Class $newly_saved_object, |
|
| 780 | - $current_cache_id = '' |
|
| 781 | - ) { |
|
| 782 | - // verify that incoming object is of the correct type |
|
| 783 | - $obj_class = 'EE_' . $relationName; |
|
| 784 | - if ($newly_saved_object instanceof $obj_class) { |
|
| 785 | - /* @type EE_Base_Class $newly_saved_object */ |
|
| 786 | - // now get the type of relation |
|
| 787 | - $relationship_to_model = $this->get_model()->related_settings_for($relationName); |
|
| 788 | - // if this is a 1:1 relationship |
|
| 789 | - if ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 790 | - // then just replace the cached object with the newly saved object |
|
| 791 | - $this->_model_relations[$relationName] = $newly_saved_object; |
|
| 792 | - return true; |
|
| 793 | - // or if it's some kind of sordid feral polyamorous relationship... |
|
| 794 | - } elseif (is_array($this->_model_relations[$relationName]) |
|
| 795 | - && isset($this->_model_relations[$relationName][$current_cache_id]) |
|
| 796 | - ) { |
|
| 797 | - // then remove the current cached item |
|
| 798 | - unset($this->_model_relations[$relationName][$current_cache_id]); |
|
| 799 | - // and cache the newly saved object using it's new ID |
|
| 800 | - $this->_model_relations[$relationName][$newly_saved_object->ID()] = $newly_saved_object; |
|
| 801 | - return true; |
|
| 802 | - } |
|
| 803 | - } |
|
| 804 | - return false; |
|
| 805 | - } |
|
| 806 | - |
|
| 807 | - |
|
| 808 | - |
|
| 809 | - /** |
|
| 810 | - * Fetches a single EE_Base_Class on that relation. (If the relation is of type |
|
| 811 | - * BelongsTo, it will only ever have 1 object. However, other relations could have an array of objects) |
|
| 812 | - * |
|
| 813 | - * @param string $relationName |
|
| 814 | - * @return EE_Base_Class |
|
| 815 | - */ |
|
| 816 | - public function get_one_from_cache($relationName) |
|
| 817 | - { |
|
| 818 | - $cached_array_or_object = isset($this->_model_relations[$relationName]) ? $this->_model_relations[$relationName] |
|
| 819 | - : null; |
|
| 820 | - if (is_array($cached_array_or_object)) { |
|
| 821 | - return array_shift($cached_array_or_object); |
|
| 822 | - } else { |
|
| 823 | - return $cached_array_or_object; |
|
| 824 | - } |
|
| 825 | - } |
|
| 826 | - |
|
| 827 | - |
|
| 828 | - |
|
| 829 | - /** |
|
| 830 | - * Fetches a single EE_Base_Class on that relation. (If the relation is of type |
|
| 831 | - * BelongsTo, it will only ever have 1 object. However, other relations could have an array of objects) |
|
| 832 | - * |
|
| 833 | - * @param string $relationName |
|
| 834 | - * @throws \EE_Error |
|
| 835 | - * @return EE_Base_Class[] NOT necessarily indexed by primary keys |
|
| 836 | - */ |
|
| 837 | - public function get_all_from_cache($relationName) |
|
| 838 | - { |
|
| 839 | - $objects = isset($this->_model_relations[$relationName]) ? $this->_model_relations[$relationName] : array(); |
|
| 840 | - // if the result is not an array, but exists, make it an array |
|
| 841 | - $objects = is_array($objects) ? $objects : array($objects); |
|
| 842 | - //bugfix for https://events.codebasehq.com/projects/event-espresso/tickets/7143 |
|
| 843 | - //basically, if this model object was stored in the session, and these cached model objects |
|
| 844 | - //already have IDs, let's make sure they're in their model's entity mapper |
|
| 845 | - //otherwise we will have duplicates next time we call |
|
| 846 | - // EE_Registry::instance()->load_model( $relationName )->get_one_by_ID( $result->ID() ); |
|
| 847 | - $model = EE_Registry::instance()->load_model($relationName); |
|
| 848 | - foreach ($objects as $model_object) { |
|
| 849 | - if ($model instanceof EEM_Base && $model_object instanceof EE_Base_Class) { |
|
| 850 | - //ensure its in the map if it has an ID; otherwise it will be added to the map when its saved |
|
| 851 | - if ($model_object->ID()) { |
|
| 852 | - $model->add_to_entity_map($model_object); |
|
| 853 | - } |
|
| 854 | - } else { |
|
| 855 | - throw new EE_Error( |
|
| 856 | - sprintf( |
|
| 857 | - __( |
|
| 858 | - 'Error retrieving related model objects. Either $1%s is not a model or $2%s is not a model object', |
|
| 859 | - 'event_espresso' |
|
| 860 | - ), |
|
| 861 | - $relationName, |
|
| 862 | - gettype($model_object) |
|
| 863 | - ) |
|
| 864 | - ); |
|
| 865 | - } |
|
| 866 | - } |
|
| 867 | - return $objects; |
|
| 868 | - } |
|
| 869 | - |
|
| 870 | - |
|
| 871 | - |
|
| 872 | - /** |
|
| 873 | - * Returns the next x number of EE_Base_Class objects in sequence from this object as found in the database |
|
| 874 | - * matching the given query conditions. |
|
| 875 | - * |
|
| 876 | - * @param null $field_to_order_by What field is being used as the reference point. |
|
| 877 | - * @param int $limit How many objects to return. |
|
| 878 | - * @param array $query_params Any additional conditions on the query. |
|
| 879 | - * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 880 | - * you can indicate just the columns you want returned |
|
| 881 | - * @return array|EE_Base_Class[] |
|
| 882 | - * @throws \EE_Error |
|
| 883 | - */ |
|
| 884 | - public function next_x($field_to_order_by = null, $limit = 1, $query_params = array(), $columns_to_select = null) |
|
| 885 | - { |
|
| 886 | - $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 887 | - ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 888 | - : $field_to_order_by; |
|
| 889 | - $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 890 | - if (empty($field) || empty($current_value)) { |
|
| 891 | - return array(); |
|
| 892 | - } |
|
| 893 | - return $this->get_model()->next_x($current_value, $field, $limit, $query_params, $columns_to_select); |
|
| 894 | - } |
|
| 895 | - |
|
| 896 | - |
|
| 897 | - |
|
| 898 | - /** |
|
| 899 | - * Returns the previous x number of EE_Base_Class objects in sequence from this object as found in the database |
|
| 900 | - * matching the given query conditions. |
|
| 901 | - * |
|
| 902 | - * @param null $field_to_order_by What field is being used as the reference point. |
|
| 903 | - * @param int $limit How many objects to return. |
|
| 904 | - * @param array $query_params Any additional conditions on the query. |
|
| 905 | - * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 906 | - * you can indicate just the columns you want returned |
|
| 907 | - * @return array|EE_Base_Class[] |
|
| 908 | - * @throws \EE_Error |
|
| 909 | - */ |
|
| 910 | - public function previous_x( |
|
| 911 | - $field_to_order_by = null, |
|
| 912 | - $limit = 1, |
|
| 913 | - $query_params = array(), |
|
| 914 | - $columns_to_select = null |
|
| 915 | - ) { |
|
| 916 | - $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 917 | - ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 918 | - : $field_to_order_by; |
|
| 919 | - $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 920 | - if (empty($field) || empty($current_value)) { |
|
| 921 | - return array(); |
|
| 922 | - } |
|
| 923 | - return $this->get_model()->previous_x($current_value, $field, $limit, $query_params, $columns_to_select); |
|
| 924 | - } |
|
| 925 | - |
|
| 926 | - |
|
| 927 | - |
|
| 928 | - /** |
|
| 929 | - * Returns the next EE_Base_Class object in sequence from this object as found in the database |
|
| 930 | - * matching the given query conditions. |
|
| 931 | - * |
|
| 932 | - * @param null $field_to_order_by What field is being used as the reference point. |
|
| 933 | - * @param array $query_params Any additional conditions on the query. |
|
| 934 | - * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 935 | - * you can indicate just the columns you want returned |
|
| 936 | - * @return array|EE_Base_Class |
|
| 937 | - * @throws \EE_Error |
|
| 938 | - */ |
|
| 939 | - public function next($field_to_order_by = null, $query_params = array(), $columns_to_select = null) |
|
| 940 | - { |
|
| 941 | - $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 942 | - ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 943 | - : $field_to_order_by; |
|
| 944 | - $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 945 | - if (empty($field) || empty($current_value)) { |
|
| 946 | - return array(); |
|
| 947 | - } |
|
| 948 | - return $this->get_model()->next($current_value, $field, $query_params, $columns_to_select); |
|
| 949 | - } |
|
| 950 | - |
|
| 951 | - |
|
| 952 | - |
|
| 953 | - /** |
|
| 954 | - * Returns the previous EE_Base_Class object in sequence from this object as found in the database |
|
| 955 | - * matching the given query conditions. |
|
| 956 | - * |
|
| 957 | - * @param null $field_to_order_by What field is being used as the reference point. |
|
| 958 | - * @param array $query_params Any additional conditions on the query. |
|
| 959 | - * @param null $columns_to_select If left null, then an EE_Base_Class object is returned, otherwise |
|
| 960 | - * you can indicate just the column you want returned |
|
| 961 | - * @return array|EE_Base_Class |
|
| 962 | - * @throws \EE_Error |
|
| 963 | - */ |
|
| 964 | - public function previous($field_to_order_by = null, $query_params = array(), $columns_to_select = null) |
|
| 965 | - { |
|
| 966 | - $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 967 | - ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 968 | - : $field_to_order_by; |
|
| 969 | - $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 970 | - if (empty($field) || empty($current_value)) { |
|
| 971 | - return array(); |
|
| 972 | - } |
|
| 973 | - return $this->get_model()->previous($current_value, $field, $query_params, $columns_to_select); |
|
| 974 | - } |
|
| 975 | - |
|
| 976 | - |
|
| 977 | - |
|
| 978 | - /** |
|
| 979 | - * Overrides parent because parent expects old models. |
|
| 980 | - * This also doesn't do any validation, and won't work for serialized arrays |
|
| 981 | - * |
|
| 982 | - * @param string $field_name |
|
| 983 | - * @param mixed $field_value_from_db |
|
| 984 | - * @throws \EE_Error |
|
| 985 | - */ |
|
| 986 | - public function set_from_db($field_name, $field_value_from_db) |
|
| 987 | - { |
|
| 988 | - $field_obj = $this->get_model()->field_settings_for($field_name); |
|
| 989 | - if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 990 | - //you would think the DB has no NULLs for non-null label fields right? wrong! |
|
| 991 | - //eg, a CPT model object could have an entry in the posts table, but no |
|
| 992 | - //entry in the meta table. Meaning that all its columns in the meta table |
|
| 993 | - //are null! yikes! so when we find one like that, use defaults for its meta columns |
|
| 994 | - if ($field_value_from_db === null) { |
|
| 995 | - if ($field_obj->is_nullable()) { |
|
| 996 | - //if the field allows nulls, then let it be null |
|
| 997 | - $field_value = null; |
|
| 998 | - } else { |
|
| 999 | - $field_value = $field_obj->get_default_value(); |
|
| 1000 | - } |
|
| 1001 | - } else { |
|
| 1002 | - $field_value = $field_obj->prepare_for_set_from_db($field_value_from_db); |
|
| 1003 | - } |
|
| 1004 | - $this->_fields[$field_name] = $field_value; |
|
| 1005 | - $this->_clear_cached_property($field_name); |
|
| 1006 | - } |
|
| 1007 | - } |
|
| 1008 | - |
|
| 1009 | - |
|
| 1010 | - |
|
| 1011 | - /** |
|
| 1012 | - * verifies that the specified field is of the correct type |
|
| 1013 | - * |
|
| 1014 | - * @param string $field_name |
|
| 1015 | - * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1016 | - * (in cases where the same property may be used for different outputs |
|
| 1017 | - * - i.e. datetime, money etc.) |
|
| 1018 | - * @return mixed |
|
| 1019 | - * @throws \EE_Error |
|
| 1020 | - */ |
|
| 1021 | - public function get($field_name, $extra_cache_ref = null) |
|
| 1022 | - { |
|
| 1023 | - return $this->_get_cached_property($field_name, false, $extra_cache_ref); |
|
| 1024 | - } |
|
| 1025 | - |
|
| 1026 | - |
|
| 1027 | - |
|
| 1028 | - /** |
|
| 1029 | - * This method simply returns the RAW unprocessed value for the given property in this class |
|
| 1030 | - * |
|
| 1031 | - * @param string $field_name A valid fieldname |
|
| 1032 | - * @return mixed Whatever the raw value stored on the property is. |
|
| 1033 | - * @throws EE_Error if fieldSettings is misconfigured or the field doesn't exist. |
|
| 1034 | - */ |
|
| 1035 | - public function get_raw($field_name) |
|
| 1036 | - { |
|
| 1037 | - $field_settings = $this->get_model()->field_settings_for($field_name); |
|
| 1038 | - return $field_settings instanceof EE_Datetime_Field && $this->_fields[$field_name] instanceof DateTime |
|
| 1039 | - ? $this->_fields[$field_name]->format('U') |
|
| 1040 | - : $this->_fields[$field_name]; |
|
| 1041 | - } |
|
| 1042 | - |
|
| 1043 | - |
|
| 1044 | - |
|
| 1045 | - /** |
|
| 1046 | - * This is used to return the internal DateTime object used for a field that is a |
|
| 1047 | - * EE_Datetime_Field. |
|
| 1048 | - * |
|
| 1049 | - * @param string $field_name The field name retrieving the DateTime object. |
|
| 1050 | - * @return mixed null | false | DateTime If the requested field is NOT a EE_Datetime_Field then |
|
| 1051 | - * @throws \EE_Error |
|
| 1052 | - * an error is set and false returned. If the field IS an |
|
| 1053 | - * EE_Datetime_Field and but the field value is null, then |
|
| 1054 | - * just null is returned (because that indicates that likely |
|
| 1055 | - * this field is nullable). |
|
| 1056 | - */ |
|
| 1057 | - public function get_DateTime_object($field_name) |
|
| 1058 | - { |
|
| 1059 | - $field_settings = $this->get_model()->field_settings_for($field_name); |
|
| 1060 | - if ( ! $field_settings instanceof EE_Datetime_Field) { |
|
| 1061 | - EE_Error::add_error( |
|
| 1062 | - sprintf( |
|
| 1063 | - __( |
|
| 1064 | - 'The field %s is not an EE_Datetime_Field field. There is no DateTime object stored on this field type.', |
|
| 1065 | - 'event_espresso' |
|
| 1066 | - ), |
|
| 1067 | - $field_name |
|
| 1068 | - ), |
|
| 1069 | - __FILE__, |
|
| 1070 | - __FUNCTION__, |
|
| 1071 | - __LINE__ |
|
| 1072 | - ); |
|
| 1073 | - return false; |
|
| 1074 | - } |
|
| 1075 | - return $this->_fields[$field_name]; |
|
| 1076 | - } |
|
| 1077 | - |
|
| 1078 | - |
|
| 1079 | - |
|
| 1080 | - /** |
|
| 1081 | - * To be used in template to immediately echo out the value, and format it for output. |
|
| 1082 | - * Eg, should call stripslashes and whatnot before echoing |
|
| 1083 | - * |
|
| 1084 | - * @param string $field_name the name of the field as it appears in the DB |
|
| 1085 | - * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1086 | - * (in cases where the same property may be used for different outputs |
|
| 1087 | - * - i.e. datetime, money etc.) |
|
| 1088 | - * @return void |
|
| 1089 | - * @throws \EE_Error |
|
| 1090 | - */ |
|
| 1091 | - public function e($field_name, $extra_cache_ref = null) |
|
| 1092 | - { |
|
| 1093 | - echo $this->get_pretty($field_name, $extra_cache_ref); |
|
| 1094 | - } |
|
| 1095 | - |
|
| 1096 | - |
|
| 1097 | - |
|
| 1098 | - /** |
|
| 1099 | - * Exactly like e(), echoes out the field, but sets its schema to 'form_input', so that it |
|
| 1100 | - * can be easily used as the value of form input. |
|
| 1101 | - * |
|
| 1102 | - * @param string $field_name |
|
| 1103 | - * @return void |
|
| 1104 | - * @throws \EE_Error |
|
| 1105 | - */ |
|
| 1106 | - public function f($field_name) |
|
| 1107 | - { |
|
| 1108 | - $this->e($field_name, 'form_input'); |
|
| 1109 | - } |
|
| 1110 | - |
|
| 1111 | - |
|
| 1112 | - |
|
| 1113 | - /** |
|
| 1114 | - * Gets a pretty view of the field's value. $extra_cache_ref can specify different formats for this. |
|
| 1115 | - * The $extra_cache_ref will be passed to the model field's prepare_for_pretty_echoing, so consult the field's class |
|
| 1116 | - * to see what options are available. |
|
| 1117 | - * @param string $field_name |
|
| 1118 | - * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1119 | - * (in cases where the same property may be used for different outputs |
|
| 1120 | - * - i.e. datetime, money etc.) |
|
| 1121 | - * @return mixed |
|
| 1122 | - * @throws \EE_Error |
|
| 1123 | - */ |
|
| 1124 | - public function get_pretty($field_name, $extra_cache_ref = null) |
|
| 1125 | - { |
|
| 1126 | - return $this->_get_cached_property($field_name, true, $extra_cache_ref); |
|
| 1127 | - } |
|
| 1128 | - |
|
| 1129 | - |
|
| 1130 | - |
|
| 1131 | - /** |
|
| 1132 | - * This simply returns the datetime for the given field name |
|
| 1133 | - * Note: this protected function is called by the wrapper get_date or get_time or get_datetime functions |
|
| 1134 | - * (and the equivalent e_date, e_time, e_datetime). |
|
| 1135 | - * |
|
| 1136 | - * @access protected |
|
| 1137 | - * @param string $field_name Field on the instantiated EE_Base_Class child object |
|
| 1138 | - * @param string $dt_frmt valid datetime format used for date |
|
| 1139 | - * (if '' then we just use the default on the field, |
|
| 1140 | - * if NULL we use the last-used format) |
|
| 1141 | - * @param string $tm_frmt Same as above except this is for time format |
|
| 1142 | - * @param string $date_or_time if NULL then both are returned, otherwise "D" = only date and "T" = only time. |
|
| 1143 | - * @param boolean $echo Whether the dtt is echoing using pretty echoing or just returned using vanilla get |
|
| 1144 | - * @return string|bool|EE_Error string on success, FALSE on fail, or EE_Error Exception is thrown |
|
| 1145 | - * if field is not a valid dtt field, or void if echoing |
|
| 1146 | - * @throws \EE_Error |
|
| 1147 | - */ |
|
| 1148 | - protected function _get_datetime($field_name, $dt_frmt = '', $tm_frmt = '', $date_or_time = '', $echo = false) |
|
| 1149 | - { |
|
| 1150 | - // clear cached property |
|
| 1151 | - $this->_clear_cached_property($field_name); |
|
| 1152 | - //reset format properties because they are used in get() |
|
| 1153 | - $this->_dt_frmt = $dt_frmt !== '' ? $dt_frmt : $this->_dt_frmt; |
|
| 1154 | - $this->_tm_frmt = $tm_frmt !== '' ? $tm_frmt : $this->_tm_frmt; |
|
| 1155 | - if ($echo) { |
|
| 1156 | - $this->e($field_name, $date_or_time); |
|
| 1157 | - return ''; |
|
| 1158 | - } |
|
| 1159 | - return $this->get($field_name, $date_or_time); |
|
| 1160 | - } |
|
| 1161 | - |
|
| 1162 | - |
|
| 1163 | - |
|
| 1164 | - /** |
|
| 1165 | - * below are wrapper functions for the various datetime outputs that can be obtained for JUST returning the date |
|
| 1166 | - * portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1167 | - * other echoes the pretty value for dtt) |
|
| 1168 | - * |
|
| 1169 | - * @param string $field_name name of model object datetime field holding the value |
|
| 1170 | - * @param string $format format for the date returned (if NULL we use default in dt_frmt property) |
|
| 1171 | - * @return string datetime value formatted |
|
| 1172 | - * @throws \EE_Error |
|
| 1173 | - */ |
|
| 1174 | - public function get_date($field_name, $format = '') |
|
| 1175 | - { |
|
| 1176 | - return $this->_get_datetime($field_name, $format, null, 'D'); |
|
| 1177 | - } |
|
| 1178 | - |
|
| 1179 | - |
|
| 1180 | - |
|
| 1181 | - /** |
|
| 1182 | - * @param $field_name |
|
| 1183 | - * @param string $format |
|
| 1184 | - * @throws \EE_Error |
|
| 1185 | - */ |
|
| 1186 | - public function e_date($field_name, $format = '') |
|
| 1187 | - { |
|
| 1188 | - $this->_get_datetime($field_name, $format, null, 'D', true); |
|
| 1189 | - } |
|
| 1190 | - |
|
| 1191 | - |
|
| 1192 | - |
|
| 1193 | - /** |
|
| 1194 | - * below are wrapper functions for the various datetime outputs that can be obtained for JUST returning the time |
|
| 1195 | - * portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1196 | - * other echoes the pretty value for dtt) |
|
| 1197 | - * |
|
| 1198 | - * @param string $field_name name of model object datetime field holding the value |
|
| 1199 | - * @param string $format format for the time returned ( if NULL we use default in tm_frmt property) |
|
| 1200 | - * @return string datetime value formatted |
|
| 1201 | - * @throws \EE_Error |
|
| 1202 | - */ |
|
| 1203 | - public function get_time($field_name, $format = '') |
|
| 1204 | - { |
|
| 1205 | - return $this->_get_datetime($field_name, null, $format, 'T'); |
|
| 1206 | - } |
|
| 1207 | - |
|
| 1208 | - |
|
| 1209 | - |
|
| 1210 | - /** |
|
| 1211 | - * @param $field_name |
|
| 1212 | - * @param string $format |
|
| 1213 | - * @throws \EE_Error |
|
| 1214 | - */ |
|
| 1215 | - public function e_time($field_name, $format = '') |
|
| 1216 | - { |
|
| 1217 | - $this->_get_datetime($field_name, null, $format, 'T', true); |
|
| 1218 | - } |
|
| 1219 | - |
|
| 1220 | - |
|
| 1221 | - |
|
| 1222 | - /** |
|
| 1223 | - * below are wrapper functions for the various datetime outputs that can be obtained for returning the date AND |
|
| 1224 | - * time portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1225 | - * other echoes the pretty value for dtt) |
|
| 1226 | - * |
|
| 1227 | - * @param string $field_name name of model object datetime field holding the value |
|
| 1228 | - * @param string $dt_frmt format for the date returned (if NULL we use default in dt_frmt property) |
|
| 1229 | - * @param string $tm_frmt format for the time returned (if NULL we use default in tm_frmt property) |
|
| 1230 | - * @return string datetime value formatted |
|
| 1231 | - * @throws \EE_Error |
|
| 1232 | - */ |
|
| 1233 | - public function get_datetime($field_name, $dt_frmt = '', $tm_frmt = '') |
|
| 1234 | - { |
|
| 1235 | - return $this->_get_datetime($field_name, $dt_frmt, $tm_frmt); |
|
| 1236 | - } |
|
| 1237 | - |
|
| 1238 | - |
|
| 1239 | - |
|
| 1240 | - /** |
|
| 1241 | - * @param string $field_name |
|
| 1242 | - * @param string $dt_frmt |
|
| 1243 | - * @param string $tm_frmt |
|
| 1244 | - * @throws \EE_Error |
|
| 1245 | - */ |
|
| 1246 | - public function e_datetime($field_name, $dt_frmt = '', $tm_frmt = '') |
|
| 1247 | - { |
|
| 1248 | - $this->_get_datetime($field_name, $dt_frmt, $tm_frmt, null, true); |
|
| 1249 | - } |
|
| 1250 | - |
|
| 1251 | - |
|
| 1252 | - |
|
| 1253 | - /** |
|
| 1254 | - * Get the i8ln value for a date using the WordPress @see date_i18n function. |
|
| 1255 | - * |
|
| 1256 | - * @param string $field_name The EE_Datetime_Field reference for the date being retrieved. |
|
| 1257 | - * @param string $format PHP valid date/time string format. If none is provided then the internal set format |
|
| 1258 | - * on the object will be used. |
|
| 1259 | - * @return string Date and time string in set locale or false if no field exists for the given |
|
| 1260 | - * @throws \EE_Error |
|
| 1261 | - * field name. |
|
| 1262 | - */ |
|
| 1263 | - public function get_i18n_datetime($field_name, $format = '') |
|
| 1264 | - { |
|
| 1265 | - $format = empty($format) ? $this->_dt_frmt . ' ' . $this->_tm_frmt : $format; |
|
| 1266 | - return date_i18n( |
|
| 1267 | - $format, |
|
| 1268 | - EEH_DTT_Helper::get_timestamp_with_offset($this->get_raw($field_name), $this->_timezone) |
|
| 1269 | - ); |
|
| 1270 | - } |
|
| 1271 | - |
|
| 1272 | - |
|
| 1273 | - |
|
| 1274 | - /** |
|
| 1275 | - * This method validates whether the given field name is a valid field on the model object as well as it is of a |
|
| 1276 | - * type EE_Datetime_Field. On success there will be returned the field settings. On fail an EE_Error exception is |
|
| 1277 | - * thrown. |
|
| 1278 | - * |
|
| 1279 | - * @param string $field_name The field name being checked |
|
| 1280 | - * @throws EE_Error |
|
| 1281 | - * @return EE_Datetime_Field |
|
| 1282 | - */ |
|
| 1283 | - protected function _get_dtt_field_settings($field_name) |
|
| 1284 | - { |
|
| 1285 | - $field = $this->get_model()->field_settings_for($field_name); |
|
| 1286 | - //check if field is dtt |
|
| 1287 | - if ($field instanceof EE_Datetime_Field) { |
|
| 1288 | - return $field; |
|
| 1289 | - } else { |
|
| 1290 | - throw new EE_Error(sprintf(__('The field name "%s" has been requested for the EE_Base_Class datetime functions and it is not a valid EE_Datetime_Field. Please check the spelling of the field and make sure it has been setup as a EE_Datetime_Field in the %s model constructor', |
|
| 1291 | - 'event_espresso'), $field_name, self::_get_model_classname(get_class($this)))); |
|
| 1292 | - } |
|
| 1293 | - } |
|
| 1294 | - |
|
| 1295 | - |
|
| 1296 | - |
|
| 1297 | - |
|
| 1298 | - /** |
|
| 1299 | - * NOTE ABOUT BELOW: |
|
| 1300 | - * These convenience date and time setters are for setting date and time independently. In other words you might |
|
| 1301 | - * want to change the time on a datetime_field but leave the date the same (or vice versa). IF on the other hand |
|
| 1302 | - * you want to set both date and time at the same time, you can just use the models default set($fieldname,$value) |
|
| 1303 | - * method and make sure you send the entire datetime value for setting. |
|
| 1304 | - */ |
|
| 1305 | - /** |
|
| 1306 | - * sets the time on a datetime property |
|
| 1307 | - * |
|
| 1308 | - * @access protected |
|
| 1309 | - * @param string|Datetime $time a valid time string for php datetime functions (or DateTime object) |
|
| 1310 | - * @param string $fieldname the name of the field the time is being set on (must match a EE_Datetime_Field) |
|
| 1311 | - * @throws \EE_Error |
|
| 1312 | - */ |
|
| 1313 | - protected function _set_time_for($time, $fieldname) |
|
| 1314 | - { |
|
| 1315 | - $this->_set_date_time('T', $time, $fieldname); |
|
| 1316 | - } |
|
| 1317 | - |
|
| 1318 | - |
|
| 1319 | - |
|
| 1320 | - /** |
|
| 1321 | - * sets the date on a datetime property |
|
| 1322 | - * |
|
| 1323 | - * @access protected |
|
| 1324 | - * @param string|DateTime $date a valid date string for php datetime functions ( or DateTime object) |
|
| 1325 | - * @param string $fieldname the name of the field the date is being set on (must match a EE_Datetime_Field) |
|
| 1326 | - * @throws \EE_Error |
|
| 1327 | - */ |
|
| 1328 | - protected function _set_date_for($date, $fieldname) |
|
| 1329 | - { |
|
| 1330 | - $this->_set_date_time('D', $date, $fieldname); |
|
| 1331 | - } |
|
| 1332 | - |
|
| 1333 | - |
|
| 1334 | - |
|
| 1335 | - /** |
|
| 1336 | - * This takes care of setting a date or time independently on a given model object property. This method also |
|
| 1337 | - * verifies that the given fieldname matches a model object property and is for a EE_Datetime_Field field |
|
| 1338 | - * |
|
| 1339 | - * @access protected |
|
| 1340 | - * @param string $what "T" for time, 'B' for both, 'D' for Date. |
|
| 1341 | - * @param string|DateTime $datetime_value A valid Date or Time string (or DateTime object) |
|
| 1342 | - * @param string $fieldname the name of the field the date OR time is being set on (must match a |
|
| 1343 | - * EE_Datetime_Field property) |
|
| 1344 | - * @throws \EE_Error |
|
| 1345 | - */ |
|
| 1346 | - protected function _set_date_time($what = 'T', $datetime_value, $fieldname) |
|
| 1347 | - { |
|
| 1348 | - $field = $this->_get_dtt_field_settings($fieldname); |
|
| 1349 | - $field->set_timezone($this->_timezone); |
|
| 1350 | - $field->set_date_format($this->_dt_frmt); |
|
| 1351 | - $field->set_time_format($this->_tm_frmt); |
|
| 1352 | - switch ($what) { |
|
| 1353 | - case 'T' : |
|
| 1354 | - $this->_fields[$fieldname] = $field->prepare_for_set_with_new_time( |
|
| 1355 | - $datetime_value, |
|
| 1356 | - $this->_fields[$fieldname] |
|
| 1357 | - ); |
|
| 1358 | - break; |
|
| 1359 | - case 'D' : |
|
| 1360 | - $this->_fields[$fieldname] = $field->prepare_for_set_with_new_date( |
|
| 1361 | - $datetime_value, |
|
| 1362 | - $this->_fields[$fieldname] |
|
| 1363 | - ); |
|
| 1364 | - break; |
|
| 1365 | - case 'B' : |
|
| 1366 | - $this->_fields[$fieldname] = $field->prepare_for_set($datetime_value); |
|
| 1367 | - break; |
|
| 1368 | - } |
|
| 1369 | - $this->_clear_cached_property($fieldname); |
|
| 1370 | - } |
|
| 1371 | - |
|
| 1372 | - |
|
| 1373 | - |
|
| 1374 | - /** |
|
| 1375 | - * This will return a timestamp for the website timezone but ONLY when the current website timezone is different |
|
| 1376 | - * than the timezone set for the website. NOTE, this currently only works well with methods that return values. If |
|
| 1377 | - * you use it with methods that echo values the $_timestamp property may not get reset to its original value and |
|
| 1378 | - * that could lead to some unexpected results! |
|
| 1379 | - * |
|
| 1380 | - * @access public |
|
| 1381 | - * @param string $field_name This is the name of the field on the object that contains the date/time |
|
| 1382 | - * value being returned. |
|
| 1383 | - * @param string $callback must match a valid method in this class (defaults to get_datetime) |
|
| 1384 | - * @param mixed (array|string) $args This is the arguments that will be passed to the callback. |
|
| 1385 | - * @param string $prepend You can include something to prepend on the timestamp |
|
| 1386 | - * @param string $append You can include something to append on the timestamp |
|
| 1387 | - * @throws EE_Error |
|
| 1388 | - * @return string timestamp |
|
| 1389 | - */ |
|
| 1390 | - public function display_in_my_timezone( |
|
| 1391 | - $field_name, |
|
| 1392 | - $callback = 'get_datetime', |
|
| 1393 | - $args = null, |
|
| 1394 | - $prepend = '', |
|
| 1395 | - $append = '' |
|
| 1396 | - ) { |
|
| 1397 | - $timezone = EEH_DTT_Helper::get_timezone(); |
|
| 1398 | - if ($timezone === $this->_timezone) { |
|
| 1399 | - return ''; |
|
| 1400 | - } |
|
| 1401 | - $original_timezone = $this->_timezone; |
|
| 1402 | - $this->set_timezone($timezone); |
|
| 1403 | - $fn = (array)$field_name; |
|
| 1404 | - $args = array_merge($fn, (array)$args); |
|
| 1405 | - if ( ! method_exists($this, $callback)) { |
|
| 1406 | - throw new EE_Error( |
|
| 1407 | - sprintf( |
|
| 1408 | - __( |
|
| 1409 | - 'The method named "%s" given as the callback param in "display_in_my_timezone" does not exist. Please check your spelling', |
|
| 1410 | - 'event_espresso' |
|
| 1411 | - ), |
|
| 1412 | - $callback |
|
| 1413 | - ) |
|
| 1414 | - ); |
|
| 1415 | - } |
|
| 1416 | - $args = (array)$args; |
|
| 1417 | - $return = $prepend . call_user_func_array(array($this, $callback), $args) . $append; |
|
| 1418 | - $this->set_timezone($original_timezone); |
|
| 1419 | - return $return; |
|
| 1420 | - } |
|
| 1421 | - |
|
| 1422 | - |
|
| 1423 | - |
|
| 1424 | - /** |
|
| 1425 | - * Deletes this model object. |
|
| 1426 | - * This calls the `EE_Base_Class::_delete` method. Child classes wishing to change default behaviour should |
|
| 1427 | - * override |
|
| 1428 | - * `EE_Base_Class::_delete` NOT this class. |
|
| 1429 | - * |
|
| 1430 | - * @return boolean | int |
|
| 1431 | - * @throws \EE_Error |
|
| 1432 | - */ |
|
| 1433 | - public function delete() |
|
| 1434 | - { |
|
| 1435 | - /** |
|
| 1436 | - * Called just before the `EE_Base_Class::_delete` method call. |
|
| 1437 | - * Note: `EE_Base_Class::_delete` might be overridden by child classes so any client code hooking into these actions |
|
| 1438 | - * should be aware that `_delete` may not always result in a permanent delete. For example, `EE_Soft_Delete_Base_Class::_delete` |
|
| 1439 | - * soft deletes (trash) the object and does not permanently delete it. |
|
| 1440 | - * |
|
| 1441 | - * @param EE_Base_Class $model_object about to be 'deleted' |
|
| 1442 | - */ |
|
| 1443 | - do_action('AHEE__EE_Base_Class__delete__before', $this); |
|
| 1444 | - $result = $this->_delete(); |
|
| 1445 | - /** |
|
| 1446 | - * Called just after the `EE_Base_Class::_delete` method call. |
|
| 1447 | - * Note: `EE_Base_Class::_delete` might be overridden by child classes so any client code hooking into these actions |
|
| 1448 | - * should be aware that `_delete` may not always result in a permanent delete. For example `EE_Soft_Base_Class::_delete` |
|
| 1449 | - * soft deletes (trash) the object and does not permanently delete it. |
|
| 1450 | - * |
|
| 1451 | - * @param EE_Base_Class $model_object that was just 'deleted' |
|
| 1452 | - * @param boolean $result |
|
| 1453 | - */ |
|
| 1454 | - do_action('AHEE__EE_Base_Class__delete__end', $this, $result); |
|
| 1455 | - return $result; |
|
| 1456 | - } |
|
| 1457 | - |
|
| 1458 | - |
|
| 1459 | - |
|
| 1460 | - /** |
|
| 1461 | - * Calls the specific delete method for the instantiated class. |
|
| 1462 | - * This method is called by the public `EE_Base_Class::delete` method. Any child classes desiring to override |
|
| 1463 | - * default functionality for "delete" (which is to call `permanently_delete`) should override this method NOT |
|
| 1464 | - * `EE_Base_Class::delete` |
|
| 1465 | - * |
|
| 1466 | - * @return bool|int |
|
| 1467 | - * @throws \EE_Error |
|
| 1468 | - */ |
|
| 1469 | - protected function _delete() |
|
| 1470 | - { |
|
| 1471 | - return $this->delete_permanently(); |
|
| 1472 | - } |
|
| 1473 | - |
|
| 1474 | - |
|
| 1475 | - |
|
| 1476 | - /** |
|
| 1477 | - * Deletes this model object permanently from db (but keep in mind related models my block the delete and return an |
|
| 1478 | - * error) |
|
| 1479 | - * |
|
| 1480 | - * @return bool | int |
|
| 1481 | - * @throws \EE_Error |
|
| 1482 | - */ |
|
| 1483 | - public function delete_permanently() |
|
| 1484 | - { |
|
| 1485 | - /** |
|
| 1486 | - * Called just before HARD deleting a model object |
|
| 1487 | - * |
|
| 1488 | - * @param EE_Base_Class $model_object about to be 'deleted' |
|
| 1489 | - */ |
|
| 1490 | - do_action('AHEE__EE_Base_Class__delete_permanently__before', $this); |
|
| 1491 | - $model = $this->get_model(); |
|
| 1492 | - $result = $model->delete_permanently_by_ID($this->ID()); |
|
| 1493 | - $this->refresh_cache_of_related_objects(); |
|
| 1494 | - /** |
|
| 1495 | - * Called just after HARD deleting a model object |
|
| 1496 | - * |
|
| 1497 | - * @param EE_Base_Class $model_object that was just 'deleted' |
|
| 1498 | - * @param boolean $result |
|
| 1499 | - */ |
|
| 1500 | - do_action('AHEE__EE_Base_Class__delete_permanently__end', $this, $result); |
|
| 1501 | - return $result; |
|
| 1502 | - } |
|
| 1503 | - |
|
| 1504 | - |
|
| 1505 | - |
|
| 1506 | - /** |
|
| 1507 | - * When this model object is deleted, it may still be cached on related model objects. This clears the cache of |
|
| 1508 | - * related model objects |
|
| 1509 | - * |
|
| 1510 | - * @throws \EE_Error |
|
| 1511 | - */ |
|
| 1512 | - public function refresh_cache_of_related_objects() |
|
| 1513 | - { |
|
| 1514 | - foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 1515 | - if ( ! empty($this->_model_relations[$relation_name])) { |
|
| 1516 | - $related_objects = $this->_model_relations[$relation_name]; |
|
| 1517 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 1518 | - //this relation only stores a single model object, not an array |
|
| 1519 | - //but let's make it consistent |
|
| 1520 | - $related_objects = array($related_objects); |
|
| 1521 | - } |
|
| 1522 | - foreach ($related_objects as $related_object) { |
|
| 1523 | - //only refresh their cache if they're in memory |
|
| 1524 | - if ($related_object instanceof EE_Base_Class) { |
|
| 1525 | - $related_object->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 1526 | - } |
|
| 1527 | - } |
|
| 1528 | - } |
|
| 1529 | - } |
|
| 1530 | - } |
|
| 1531 | - |
|
| 1532 | - |
|
| 1533 | - |
|
| 1534 | - /** |
|
| 1535 | - * Saves this object to the database. An array may be supplied to set some values on this |
|
| 1536 | - * object just before saving. |
|
| 1537 | - * |
|
| 1538 | - * @access public |
|
| 1539 | - * @param array $set_cols_n_values keys are field names, values are their new values, |
|
| 1540 | - * if provided during the save() method (often client code will change the fields' |
|
| 1541 | - * values before calling save) |
|
| 1542 | - * @throws \EE_Error |
|
| 1543 | - * @return int , 1 on a successful update, the ID of the new entry on insert; 0 on failure or if the model object |
|
| 1544 | - * isn't allowed to persist (as determined by EE_Base_Class::allow_persist()) |
|
| 1545 | - */ |
|
| 1546 | - public function save($set_cols_n_values = array()) |
|
| 1547 | - { |
|
| 1548 | - /** |
|
| 1549 | - * Filters the fields we're about to save on the model object |
|
| 1550 | - * |
|
| 1551 | - * @param array $set_cols_n_values |
|
| 1552 | - * @param EE_Base_Class $model_object |
|
| 1553 | - */ |
|
| 1554 | - $set_cols_n_values = (array)apply_filters('FHEE__EE_Base_Class__save__set_cols_n_values', $set_cols_n_values, |
|
| 1555 | - $this); |
|
| 1556 | - //set attributes as provided in $set_cols_n_values |
|
| 1557 | - foreach ($set_cols_n_values as $column => $value) { |
|
| 1558 | - $this->set($column, $value); |
|
| 1559 | - } |
|
| 1560 | - /** |
|
| 1561 | - * Saving a model object. |
|
| 1562 | - * Before we perform a save, this action is fired. |
|
| 1563 | - * |
|
| 1564 | - * @param EE_Base_Class $model_object the model object about to be saved. |
|
| 1565 | - */ |
|
| 1566 | - do_action('AHEE__EE_Base_Class__save__begin', $this); |
|
| 1567 | - if ( ! $this->allow_persist()) { |
|
| 1568 | - return 0; |
|
| 1569 | - } |
|
| 1570 | - //now get current attribute values |
|
| 1571 | - $save_cols_n_values = $this->_fields; |
|
| 1572 | - //if the object already has an ID, update it. Otherwise, insert it |
|
| 1573 | - //also: change the assumption about values passed to the model NOT being prepare dby the model object. They have been |
|
| 1574 | - $old_assumption_concerning_value_preparation = $this->get_model() |
|
| 1575 | - ->get_assumption_concerning_values_already_prepared_by_model_object(); |
|
| 1576 | - $this->get_model()->assume_values_already_prepared_by_model_object(true); |
|
| 1577 | - //does this model have an autoincrement PK? |
|
| 1578 | - if ($this->get_model()->has_primary_key_field()) { |
|
| 1579 | - if ($this->get_model()->get_primary_key_field()->is_auto_increment()) { |
|
| 1580 | - //ok check if it's set, if so: update; if not, insert |
|
| 1581 | - if ( ! empty($save_cols_n_values[self::_get_primary_key_name(get_class($this))])) { |
|
| 1582 | - $results = $this->get_model()->update_by_ID($save_cols_n_values, $this->ID()); |
|
| 1583 | - } else { |
|
| 1584 | - unset($save_cols_n_values[self::_get_primary_key_name(get_class($this))]); |
|
| 1585 | - $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1586 | - if ($results) { |
|
| 1587 | - //if successful, set the primary key |
|
| 1588 | - //but don't use the normal SET method, because it will check if |
|
| 1589 | - //an item with the same ID exists in the mapper & db, then |
|
| 1590 | - //will find it in the db (because we just added it) and THAT object |
|
| 1591 | - //will get added to the mapper before we can add this one! |
|
| 1592 | - //but if we just avoid using the SET method, all that headache can be avoided |
|
| 1593 | - $pk_field_name = self::_get_primary_key_name(get_class($this)); |
|
| 1594 | - $this->_fields[$pk_field_name] = $results; |
|
| 1595 | - $this->_clear_cached_property($pk_field_name); |
|
| 1596 | - $this->get_model()->add_to_entity_map($this); |
|
| 1597 | - $this->_update_cached_related_model_objs_fks(); |
|
| 1598 | - } |
|
| 1599 | - } |
|
| 1600 | - } else {//PK is NOT auto-increment |
|
| 1601 | - //so check if one like it already exists in the db |
|
| 1602 | - if ($this->get_model()->exists_by_ID($this->ID())) { |
|
| 1603 | - if (WP_DEBUG && ! $this->in_entity_map()) { |
|
| 1604 | - throw new EE_Error( |
|
| 1605 | - sprintf( |
|
| 1606 | - __('Using a model object %1$s that is NOT in the entity map, can lead to unexpected errors. You should either: %4$s 1. Put it in the entity mapper by calling %2$s %4$s 2. Discard this model object and use what is in the entity mapper %4$s 3. Fetch from the database using %3$s', |
|
| 1607 | - 'event_espresso'), |
|
| 1608 | - get_class($this), |
|
| 1609 | - get_class($this->get_model()) . '::instance()->add_to_entity_map()', |
|
| 1610 | - get_class($this->get_model()) . '::instance()->get_one_by_ID()', |
|
| 1611 | - '<br />' |
|
| 1612 | - ) |
|
| 1613 | - ); |
|
| 1614 | - } |
|
| 1615 | - $results = $this->get_model()->update_by_ID($save_cols_n_values, $this->ID()); |
|
| 1616 | - } else { |
|
| 1617 | - $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1618 | - $this->_update_cached_related_model_objs_fks(); |
|
| 1619 | - } |
|
| 1620 | - } |
|
| 1621 | - } else {//there is NO primary key |
|
| 1622 | - $already_in_db = false; |
|
| 1623 | - foreach ($this->get_model()->unique_indexes() as $index) { |
|
| 1624 | - $uniqueness_where_params = array_intersect_key($save_cols_n_values, $index->fields()); |
|
| 1625 | - if ($this->get_model()->exists(array($uniqueness_where_params))) { |
|
| 1626 | - $already_in_db = true; |
|
| 1627 | - } |
|
| 1628 | - } |
|
| 1629 | - if ($already_in_db) { |
|
| 1630 | - $combined_pk_fields_n_values = array_intersect_key($save_cols_n_values, |
|
| 1631 | - $this->get_model()->get_combined_primary_key_fields()); |
|
| 1632 | - $results = $this->get_model()->update($save_cols_n_values, $combined_pk_fields_n_values); |
|
| 1633 | - } else { |
|
| 1634 | - $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1635 | - } |
|
| 1636 | - } |
|
| 1637 | - //restore the old assumption about values being prepared by the model object |
|
| 1638 | - $this->get_model() |
|
| 1639 | - ->assume_values_already_prepared_by_model_object($old_assumption_concerning_value_preparation); |
|
| 1640 | - /** |
|
| 1641 | - * After saving the model object this action is called |
|
| 1642 | - * |
|
| 1643 | - * @param EE_Base_Class $model_object which was just saved |
|
| 1644 | - * @param boolean|int $results if it were updated, TRUE or FALSE; if it were newly inserted |
|
| 1645 | - * the new ID (or 0 if an error occurred and it wasn't updated) |
|
| 1646 | - */ |
|
| 1647 | - do_action('AHEE__EE_Base_Class__save__end', $this, $results); |
|
| 1648 | - return $results; |
|
| 1649 | - } |
|
| 1650 | - |
|
| 1651 | - |
|
| 1652 | - |
|
| 1653 | - /** |
|
| 1654 | - * Updates the foreign key on related models objects pointing to this to have this model object's ID |
|
| 1655 | - * as their foreign key. If the cached related model objects already exist in the db, saves them (so that the DB |
|
| 1656 | - * is consistent) Especially useful in case we JUST added this model object ot the database and we want to let its |
|
| 1657 | - * cached relations with foreign keys to it know about that change. Eg: we've created a transaction but haven't |
|
| 1658 | - * saved it to the db. We also create a registration and don't save it to the DB, but we DO cache it on the |
|
| 1659 | - * transaction. Now, when we save the transaction, the registration's TXN_ID will be automatically updated, whether |
|
| 1660 | - * or not they exist in the DB (if they do, their DB records will be automatically updated) |
|
| 1661 | - * |
|
| 1662 | - * @return void |
|
| 1663 | - * @throws \EE_Error |
|
| 1664 | - */ |
|
| 1665 | - protected function _update_cached_related_model_objs_fks() |
|
| 1666 | - { |
|
| 1667 | - foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 1668 | - if ($relation_obj instanceof EE_Has_Many_Relation) { |
|
| 1669 | - foreach ($this->get_all_from_cache($relation_name) as $related_model_obj_in_cache) { |
|
| 1670 | - $fk_to_this = $related_model_obj_in_cache->get_model()->get_foreign_key_to( |
|
| 1671 | - $this->get_model()->get_this_model_name() |
|
| 1672 | - ); |
|
| 1673 | - $related_model_obj_in_cache->set($fk_to_this->get_name(), $this->ID()); |
|
| 1674 | - if ($related_model_obj_in_cache->ID()) { |
|
| 1675 | - $related_model_obj_in_cache->save(); |
|
| 1676 | - } |
|
| 1677 | - } |
|
| 1678 | - } |
|
| 1679 | - } |
|
| 1680 | - } |
|
| 1681 | - |
|
| 1682 | - |
|
| 1683 | - |
|
| 1684 | - /** |
|
| 1685 | - * Saves this model object and its NEW cached relations to the database. |
|
| 1686 | - * (Meaning, for now, IT DOES NOT WORK if the cached items already exist in the DB. |
|
| 1687 | - * In order for that to work, we would need to mark model objects as dirty/clean... |
|
| 1688 | - * because otherwise, there's a potential for infinite looping of saving |
|
| 1689 | - * Saves the cached related model objects, and ensures the relation between them |
|
| 1690 | - * and this object and properly setup |
|
| 1691 | - * |
|
| 1692 | - * @return int ID of new model object on save; 0 on failure+ |
|
| 1693 | - * @throws \EE_Error |
|
| 1694 | - */ |
|
| 1695 | - public function save_new_cached_related_model_objs() |
|
| 1696 | - { |
|
| 1697 | - //make sure this has been saved |
|
| 1698 | - if ( ! $this->ID()) { |
|
| 1699 | - $id = $this->save(); |
|
| 1700 | - } else { |
|
| 1701 | - $id = $this->ID(); |
|
| 1702 | - } |
|
| 1703 | - //now save all the NEW cached model objects (ie they don't exist in the DB) |
|
| 1704 | - foreach ($this->get_model()->relation_settings() as $relationName => $relationObj) { |
|
| 1705 | - if ($this->_model_relations[$relationName]) { |
|
| 1706 | - //is this a relation where we should expect just ONE related object (ie, EE_Belongs_To_relation) |
|
| 1707 | - //or MANY related objects (ie, EE_HABTM_Relation or EE_Has_Many_Relation)? |
|
| 1708 | - if ($relationObj instanceof EE_Belongs_To_Relation) { |
|
| 1709 | - //add a relation to that relation type (which saves the appropriate thing in the process) |
|
| 1710 | - //but ONLY if it DOES NOT exist in the DB |
|
| 1711 | - /* @var $related_model_obj EE_Base_Class */ |
|
| 1712 | - $related_model_obj = $this->_model_relations[$relationName]; |
|
| 1713 | - // if( ! $related_model_obj->ID()){ |
|
| 1714 | - $this->_add_relation_to($related_model_obj, $relationName); |
|
| 1715 | - $related_model_obj->save_new_cached_related_model_objs(); |
|
| 1716 | - // } |
|
| 1717 | - } else { |
|
| 1718 | - foreach ($this->_model_relations[$relationName] as $related_model_obj) { |
|
| 1719 | - //add a relation to that relation type (which saves the appropriate thing in the process) |
|
| 1720 | - //but ONLY if it DOES NOT exist in the DB |
|
| 1721 | - // if( ! $related_model_obj->ID()){ |
|
| 1722 | - $this->_add_relation_to($related_model_obj, $relationName); |
|
| 1723 | - $related_model_obj->save_new_cached_related_model_objs(); |
|
| 1724 | - // } |
|
| 1725 | - } |
|
| 1726 | - } |
|
| 1727 | - } |
|
| 1728 | - } |
|
| 1729 | - return $id; |
|
| 1730 | - } |
|
| 1731 | - |
|
| 1732 | - |
|
| 1733 | - |
|
| 1734 | - /** |
|
| 1735 | - * for getting a model while instantiated. |
|
| 1736 | - * |
|
| 1737 | - * @return \EEM_Base | \EEM_CPT_Base |
|
| 1738 | - */ |
|
| 1739 | - public function get_model() |
|
| 1740 | - { |
|
| 1741 | - $modelName = self::_get_model_classname(get_class($this)); |
|
| 1742 | - return self::_get_model_instance_with_name($modelName, $this->_timezone); |
|
| 1743 | - } |
|
| 1744 | - |
|
| 1745 | - |
|
| 1746 | - |
|
| 1747 | - /** |
|
| 1748 | - * @param $props_n_values |
|
| 1749 | - * @param $classname |
|
| 1750 | - * @return mixed bool|EE_Base_Class|EEM_CPT_Base |
|
| 1751 | - * @throws \EE_Error |
|
| 1752 | - */ |
|
| 1753 | - protected static function _get_object_from_entity_mapper($props_n_values, $classname) |
|
| 1754 | - { |
|
| 1755 | - //TODO: will not work for Term_Relationships because they have no PK! |
|
| 1756 | - $primary_id_ref = self::_get_primary_key_name($classname); |
|
| 1757 | - if (array_key_exists($primary_id_ref, $props_n_values) && ! empty($props_n_values[$primary_id_ref])) { |
|
| 1758 | - $id = $props_n_values[$primary_id_ref]; |
|
| 1759 | - return self::_get_model($classname)->get_from_entity_map($id); |
|
| 1760 | - } |
|
| 1761 | - return false; |
|
| 1762 | - } |
|
| 1763 | - |
|
| 1764 | - |
|
| 1765 | - |
|
| 1766 | - /** |
|
| 1767 | - * This is called by child static "new_instance" method and we'll check to see if there is an existing db entry for |
|
| 1768 | - * the primary key (if present in incoming values). If there is a key in the incoming array that matches the |
|
| 1769 | - * primary key for the model AND it is not null, then we check the db. If there's a an object we return it. If not |
|
| 1770 | - * we return false. |
|
| 1771 | - * |
|
| 1772 | - * @param array $props_n_values incoming array of properties and their values |
|
| 1773 | - * @param string $classname the classname of the child class |
|
| 1774 | - * @param null $timezone |
|
| 1775 | - * @param array $date_formats incoming date_formats in an array where the first value is the |
|
| 1776 | - * date_format and the second value is the time format |
|
| 1777 | - * @return mixed (EE_Base_Class|bool) |
|
| 1778 | - * @throws \EE_Error |
|
| 1779 | - */ |
|
| 1780 | - protected static function _check_for_object($props_n_values, $classname, $timezone = null, $date_formats = array()) |
|
| 1781 | - { |
|
| 1782 | - $existing = null; |
|
| 1783 | - if (self::_get_model($classname)->has_primary_key_field()) { |
|
| 1784 | - $primary_id_ref = self::_get_primary_key_name($classname); |
|
| 1785 | - if (array_key_exists($primary_id_ref, $props_n_values) |
|
| 1786 | - && ! empty($props_n_values[$primary_id_ref]) |
|
| 1787 | - ) { |
|
| 1788 | - $existing = self::_get_model($classname, $timezone)->get_one_by_ID( |
|
| 1789 | - $props_n_values[$primary_id_ref] |
|
| 1790 | - ); |
|
| 1791 | - } |
|
| 1792 | - } elseif (self::_get_model($classname, $timezone)->has_all_combined_primary_key_fields($props_n_values)) { |
|
| 1793 | - //no primary key on this model, but there's still a matching item in the DB |
|
| 1794 | - $existing = self::_get_model($classname, $timezone)->get_one_by_ID( |
|
| 1795 | - self::_get_model($classname, $timezone)->get_index_primary_key_string($props_n_values) |
|
| 1796 | - ); |
|
| 1797 | - } |
|
| 1798 | - if ($existing) { |
|
| 1799 | - //set date formats if present before setting values |
|
| 1800 | - if ( ! empty($date_formats) && is_array($date_formats)) { |
|
| 1801 | - $existing->set_date_format($date_formats[0]); |
|
| 1802 | - $existing->set_time_format($date_formats[1]); |
|
| 1803 | - } else { |
|
| 1804 | - //set default formats for date and time |
|
| 1805 | - $existing->set_date_format(get_option('date_format')); |
|
| 1806 | - $existing->set_time_format(get_option('time_format')); |
|
| 1807 | - } |
|
| 1808 | - foreach ($props_n_values as $property => $field_value) { |
|
| 1809 | - $existing->set($property, $field_value); |
|
| 1810 | - } |
|
| 1811 | - return $existing; |
|
| 1812 | - } else { |
|
| 1813 | - return false; |
|
| 1814 | - } |
|
| 1815 | - } |
|
| 1816 | - |
|
| 1817 | - |
|
| 1818 | - |
|
| 1819 | - /** |
|
| 1820 | - * Gets the EEM_*_Model for this class |
|
| 1821 | - * |
|
| 1822 | - * @access public now, as this is more convenient |
|
| 1823 | - * @param $classname |
|
| 1824 | - * @param null $timezone |
|
| 1825 | - * @throws EE_Error |
|
| 1826 | - * @return EEM_Base |
|
| 1827 | - */ |
|
| 1828 | - protected static function _get_model($classname, $timezone = null) |
|
| 1829 | - { |
|
| 1830 | - //find model for this class |
|
| 1831 | - if ( ! $classname) { |
|
| 1832 | - throw new EE_Error( |
|
| 1833 | - sprintf( |
|
| 1834 | - __( |
|
| 1835 | - "What were you thinking calling _get_model(%s)?? You need to specify the class name", |
|
| 1836 | - "event_espresso" |
|
| 1837 | - ), |
|
| 1838 | - $classname |
|
| 1839 | - ) |
|
| 1840 | - ); |
|
| 1841 | - } |
|
| 1842 | - $modelName = self::_get_model_classname($classname); |
|
| 1843 | - return self::_get_model_instance_with_name($modelName, $timezone); |
|
| 1844 | - } |
|
| 1845 | - |
|
| 1846 | - |
|
| 1847 | - |
|
| 1848 | - /** |
|
| 1849 | - * Gets the model instance (eg instance of EEM_Attendee) given its classname (eg EE_Attendee) |
|
| 1850 | - * |
|
| 1851 | - * @param string $model_classname |
|
| 1852 | - * @param null $timezone |
|
| 1853 | - * @return EEM_Base |
|
| 1854 | - */ |
|
| 1855 | - protected static function _get_model_instance_with_name($model_classname, $timezone = null) |
|
| 1856 | - { |
|
| 1857 | - $model_classname = str_replace('EEM_', '', $model_classname); |
|
| 1858 | - $model = EE_Registry::instance()->load_model($model_classname); |
|
| 1859 | - $model->set_timezone($timezone); |
|
| 1860 | - return $model; |
|
| 1861 | - } |
|
| 1862 | - |
|
| 1863 | - |
|
| 1864 | - |
|
| 1865 | - /** |
|
| 1866 | - * If a model name is provided (eg Registration), gets the model classname for that model. |
|
| 1867 | - * Also works if a model class's classname is provided (eg EE_Registration). |
|
| 1868 | - * |
|
| 1869 | - * @param null $model_name |
|
| 1870 | - * @return string like EEM_Attendee |
|
| 1871 | - */ |
|
| 1872 | - private static function _get_model_classname($model_name = null) |
|
| 1873 | - { |
|
| 1874 | - if (strpos($model_name, "EE_") === 0) { |
|
| 1875 | - $model_classname = str_replace("EE_", "EEM_", $model_name); |
|
| 1876 | - } else { |
|
| 1877 | - $model_classname = "EEM_" . $model_name; |
|
| 1878 | - } |
|
| 1879 | - return $model_classname; |
|
| 1880 | - } |
|
| 1881 | - |
|
| 1882 | - |
|
| 1883 | - |
|
| 1884 | - /** |
|
| 1885 | - * returns the name of the primary key attribute |
|
| 1886 | - * |
|
| 1887 | - * @param null $classname |
|
| 1888 | - * @throws EE_Error |
|
| 1889 | - * @return string |
|
| 1890 | - */ |
|
| 1891 | - protected static function _get_primary_key_name($classname = null) |
|
| 1892 | - { |
|
| 1893 | - if ( ! $classname) { |
|
| 1894 | - throw new EE_Error( |
|
| 1895 | - sprintf( |
|
| 1896 | - __("What were you thinking calling _get_primary_key_name(%s)", "event_espresso"), |
|
| 1897 | - $classname |
|
| 1898 | - ) |
|
| 1899 | - ); |
|
| 1900 | - } |
|
| 1901 | - return self::_get_model($classname)->get_primary_key_field()->get_name(); |
|
| 1902 | - } |
|
| 1903 | - |
|
| 1904 | - |
|
| 1905 | - |
|
| 1906 | - /** |
|
| 1907 | - * Gets the value of the primary key. |
|
| 1908 | - * If the object hasn't yet been saved, it should be whatever the model field's default was |
|
| 1909 | - * (eg, if this were the EE_Event class, look at the primary key field on EEM_Event and see what its default value |
|
| 1910 | - * is. Usually defaults for integer primary keys are 0; string primary keys are usually NULL). |
|
| 1911 | - * |
|
| 1912 | - * @return mixed, if the primary key is of type INT it'll be an int. Otherwise it could be a string |
|
| 1913 | - * @throws \EE_Error |
|
| 1914 | - */ |
|
| 1915 | - public function ID() |
|
| 1916 | - { |
|
| 1917 | - //now that we know the name of the variable, use a variable variable to get its value and return its |
|
| 1918 | - if ($this->get_model()->has_primary_key_field()) { |
|
| 1919 | - return $this->_fields[self::_get_primary_key_name(get_class($this))]; |
|
| 1920 | - } else { |
|
| 1921 | - return $this->get_model()->get_index_primary_key_string($this->_fields); |
|
| 1922 | - } |
|
| 1923 | - } |
|
| 1924 | - |
|
| 1925 | - |
|
| 1926 | - |
|
| 1927 | - /** |
|
| 1928 | - * Adds a relationship to the specified EE_Base_Class object, given the relationship's name. Eg, if the current |
|
| 1929 | - * model is related to a group of events, the $relationName should be 'Event', and should be a key in the EE |
|
| 1930 | - * Model's $_model_relations array. If this model object doesn't exist in the DB, just caches the related thing |
|
| 1931 | - * |
|
| 1932 | - * @param mixed $otherObjectModelObjectOrID EE_Base_Class or the ID of the other object |
|
| 1933 | - * @param string $relationName eg 'Events','Question',etc. |
|
| 1934 | - * an attendee to a group, you also want to specify which role they |
|
| 1935 | - * will have in that group. So you would use this parameter to |
|
| 1936 | - * specify array('role-column-name'=>'role-id') |
|
| 1937 | - * @param array $extra_join_model_fields_n_values You can optionally include an array of key=>value pairs that |
|
| 1938 | - * allow you to further constrict the relation to being added. |
|
| 1939 | - * However, keep in mind that the columns (keys) given must match a |
|
| 1940 | - * column on the JOIN table and currently only the HABTM models |
|
| 1941 | - * accept these additional conditions. Also remember that if an |
|
| 1942 | - * exact match isn't found for these extra cols/val pairs, then a |
|
| 1943 | - * NEW row is created in the join table. |
|
| 1944 | - * @param null $cache_id |
|
| 1945 | - * @throws EE_Error |
|
| 1946 | - * @return EE_Base_Class the object the relation was added to |
|
| 1947 | - */ |
|
| 1948 | - public function _add_relation_to( |
|
| 1949 | - $otherObjectModelObjectOrID, |
|
| 1950 | - $relationName, |
|
| 1951 | - $extra_join_model_fields_n_values = array(), |
|
| 1952 | - $cache_id = null |
|
| 1953 | - ) { |
|
| 1954 | - //if this thing exists in the DB, save the relation to the DB |
|
| 1955 | - if ($this->ID()) { |
|
| 1956 | - $otherObject = $this->get_model() |
|
| 1957 | - ->add_relationship_to($this, $otherObjectModelObjectOrID, $relationName, |
|
| 1958 | - $extra_join_model_fields_n_values); |
|
| 1959 | - //clear cache so future get_many_related and get_first_related() return new results. |
|
| 1960 | - $this->clear_cache($relationName, $otherObject, true); |
|
| 1961 | - if ($otherObject instanceof EE_Base_Class) { |
|
| 1962 | - $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 1963 | - } |
|
| 1964 | - } else { |
|
| 1965 | - //this thing doesn't exist in the DB, so just cache it |
|
| 1966 | - if ( ! $otherObjectModelObjectOrID instanceof EE_Base_Class) { |
|
| 1967 | - throw new EE_Error(sprintf( |
|
| 1968 | - __('Before a model object is saved to the database, calls to _add_relation_to must be passed an actual object, not just an ID. You provided %s as the model object to a %s', |
|
| 1969 | - 'event_espresso'), |
|
| 1970 | - $otherObjectModelObjectOrID, |
|
| 1971 | - get_class($this) |
|
| 1972 | - )); |
|
| 1973 | - } else { |
|
| 1974 | - $otherObject = $otherObjectModelObjectOrID; |
|
| 1975 | - } |
|
| 1976 | - $this->cache($relationName, $otherObjectModelObjectOrID, $cache_id); |
|
| 1977 | - } |
|
| 1978 | - if ($otherObject instanceof EE_Base_Class) { |
|
| 1979 | - //fix the reciprocal relation too |
|
| 1980 | - if ($otherObject->ID()) { |
|
| 1981 | - //its saved so assumed relations exist in the DB, so we can just |
|
| 1982 | - //clear the cache so future queries use the updated info in the DB |
|
| 1983 | - $otherObject->clear_cache($this->get_model()->get_this_model_name(), null, true); |
|
| 1984 | - } else { |
|
| 1985 | - //it's not saved, so it caches relations like this |
|
| 1986 | - $otherObject->cache($this->get_model()->get_this_model_name(), $this); |
|
| 1987 | - } |
|
| 1988 | - } |
|
| 1989 | - return $otherObject; |
|
| 1990 | - } |
|
| 1991 | - |
|
| 1992 | - |
|
| 1993 | - |
|
| 1994 | - /** |
|
| 1995 | - * Removes a relationship to the specified EE_Base_Class object, given the relationships' name. Eg, if the current |
|
| 1996 | - * model is related to a group of events, the $relationName should be 'Events', and should be a key in the EE |
|
| 1997 | - * Model's $_model_relations array. If this model object doesn't exist in the DB, just removes the related thing |
|
| 1998 | - * from the cache |
|
| 1999 | - * |
|
| 2000 | - * @param mixed $otherObjectModelObjectOrID |
|
| 2001 | - * EE_Base_Class or the ID of the other object, OR an array key into the cache if this isn't saved |
|
| 2002 | - * to the DB yet |
|
| 2003 | - * @param string $relationName |
|
| 2004 | - * @param array $where_query |
|
| 2005 | - * You can optionally include an array of key=>value pairs that allow you to further constrict the |
|
| 2006 | - * relation to being added. However, keep in mind that the columns (keys) given must match a column |
|
| 2007 | - * on the JOIN table and currently only the HABTM models accept these additional conditions. Also |
|
| 2008 | - * remember that if an exact match isn't found for these extra cols/val pairs, then a NEW row is |
|
| 2009 | - * created in the join table. |
|
| 2010 | - * @return EE_Base_Class the relation was removed from |
|
| 2011 | - * @throws \EE_Error |
|
| 2012 | - */ |
|
| 2013 | - public function _remove_relation_to($otherObjectModelObjectOrID, $relationName, $where_query = array()) |
|
| 2014 | - { |
|
| 2015 | - if ($this->ID()) { |
|
| 2016 | - //if this exists in the DB, save the relation change to the DB too |
|
| 2017 | - $otherObject = $this->get_model() |
|
| 2018 | - ->remove_relationship_to($this, $otherObjectModelObjectOrID, $relationName, |
|
| 2019 | - $where_query); |
|
| 2020 | - $this->clear_cache($relationName, $otherObject); |
|
| 2021 | - } else { |
|
| 2022 | - //this doesn't exist in the DB, just remove it from the cache |
|
| 2023 | - $otherObject = $this->clear_cache($relationName, $otherObjectModelObjectOrID); |
|
| 2024 | - } |
|
| 2025 | - if ($otherObject instanceof EE_Base_Class) { |
|
| 2026 | - $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 2027 | - } |
|
| 2028 | - return $otherObject; |
|
| 2029 | - } |
|
| 2030 | - |
|
| 2031 | - |
|
| 2032 | - |
|
| 2033 | - /** |
|
| 2034 | - * Removes ALL the related things for the $relationName. |
|
| 2035 | - * |
|
| 2036 | - * @param string $relationName |
|
| 2037 | - * @param array $where_query_params like EEM_Base::get_all's $query_params[0] (where conditions) |
|
| 2038 | - * @return EE_Base_Class |
|
| 2039 | - * @throws \EE_Error |
|
| 2040 | - */ |
|
| 2041 | - public function _remove_relations($relationName, $where_query_params = array()) |
|
| 2042 | - { |
|
| 2043 | - if ($this->ID()) { |
|
| 2044 | - //if this exists in the DB, save the relation change to the DB too |
|
| 2045 | - $otherObjects = $this->get_model()->remove_relations($this, $relationName, $where_query_params); |
|
| 2046 | - $this->clear_cache($relationName, null, true); |
|
| 2047 | - } else { |
|
| 2048 | - //this doesn't exist in the DB, just remove it from the cache |
|
| 2049 | - $otherObjects = $this->clear_cache($relationName, null, true); |
|
| 2050 | - } |
|
| 2051 | - if (is_array($otherObjects)) { |
|
| 2052 | - foreach ($otherObjects as $otherObject) { |
|
| 2053 | - $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 2054 | - } |
|
| 2055 | - } |
|
| 2056 | - return $otherObjects; |
|
| 2057 | - } |
|
| 2058 | - |
|
| 2059 | - |
|
| 2060 | - |
|
| 2061 | - /** |
|
| 2062 | - * Gets all the related model objects of the specified type. Eg, if the current class if |
|
| 2063 | - * EE_Event, you could call $this->get_many_related('Registration') to get an array of all the |
|
| 2064 | - * EE_Registration objects which related to this event. Note: by default, we remove the "default query params" |
|
| 2065 | - * because we want to get even deleted items etc. |
|
| 2066 | - * |
|
| 2067 | - * @param string $relationName key in the model's _model_relations array |
|
| 2068 | - * @param array $query_params like EEM_Base::get_all |
|
| 2069 | - * @return EE_Base_Class[] Results not necessarily indexed by IDs, because some results might not have primary keys |
|
| 2070 | - * @throws \EE_Error |
|
| 2071 | - * or might not be saved yet. Consider using EEM_Base::get_IDs() on these results if |
|
| 2072 | - * you want IDs |
|
| 2073 | - */ |
|
| 2074 | - public function get_many_related($relationName, $query_params = array()) |
|
| 2075 | - { |
|
| 2076 | - if ($this->ID()) { |
|
| 2077 | - //this exists in the DB, so get the related things from either the cache or the DB |
|
| 2078 | - //if there are query parameters, forget about caching the related model objects. |
|
| 2079 | - if ($query_params) { |
|
| 2080 | - $related_model_objects = $this->get_model()->get_all_related($this, $relationName, $query_params); |
|
| 2081 | - } else { |
|
| 2082 | - //did we already cache the result of this query? |
|
| 2083 | - $cached_results = $this->get_all_from_cache($relationName); |
|
| 2084 | - if ( ! $cached_results) { |
|
| 2085 | - $related_model_objects = $this->get_model()->get_all_related($this, $relationName, $query_params); |
|
| 2086 | - //if no query parameters were passed, then we got all the related model objects |
|
| 2087 | - //for that relation. We can cache them then. |
|
| 2088 | - foreach ($related_model_objects as $related_model_object) { |
|
| 2089 | - $this->cache($relationName, $related_model_object); |
|
| 2090 | - } |
|
| 2091 | - } else { |
|
| 2092 | - $related_model_objects = $cached_results; |
|
| 2093 | - } |
|
| 2094 | - } |
|
| 2095 | - } else { |
|
| 2096 | - //this doesn't exist in the DB, so just get the related things from the cache |
|
| 2097 | - $related_model_objects = $this->get_all_from_cache($relationName); |
|
| 2098 | - } |
|
| 2099 | - return $related_model_objects; |
|
| 2100 | - } |
|
| 2101 | - |
|
| 2102 | - |
|
| 2103 | - |
|
| 2104 | - /** |
|
| 2105 | - * Instead of getting the related model objects, simply counts them. Ignores default_where_conditions by default, |
|
| 2106 | - * unless otherwise specified in the $query_params |
|
| 2107 | - * |
|
| 2108 | - * @param string $relation_name model_name like 'Event', or 'Registration' |
|
| 2109 | - * @param array $query_params like EEM_Base::get_all's |
|
| 2110 | - * @param string $field_to_count name of field to count by. By default, uses primary key |
|
| 2111 | - * @param bool $distinct if we want to only count the distinct values for the column then you can trigger |
|
| 2112 | - * that by the setting $distinct to TRUE; |
|
| 2113 | - * @return int |
|
| 2114 | - */ |
|
| 2115 | - public function count_related($relation_name, $query_params = array(), $field_to_count = null, $distinct = false) |
|
| 2116 | - { |
|
| 2117 | - return $this->get_model()->count_related($this, $relation_name, $query_params, $field_to_count, $distinct); |
|
| 2118 | - } |
|
| 2119 | - |
|
| 2120 | - |
|
| 2121 | - |
|
| 2122 | - /** |
|
| 2123 | - * Instead of getting the related model objects, simply sums up the values of the specified field. |
|
| 2124 | - * Note: ignores default_where_conditions by default, unless otherwise specified in the $query_params |
|
| 2125 | - * |
|
| 2126 | - * @param string $relation_name model_name like 'Event', or 'Registration' |
|
| 2127 | - * @param array $query_params like EEM_Base::get_all's |
|
| 2128 | - * @param string $field_to_sum name of field to count by. |
|
| 2129 | - * By default, uses primary key (which doesn't make much sense, so you should probably |
|
| 2130 | - * change it) |
|
| 2131 | - * @return int |
|
| 2132 | - */ |
|
| 2133 | - public function sum_related($relation_name, $query_params = array(), $field_to_sum = null) |
|
| 2134 | - { |
|
| 2135 | - return $this->get_model()->sum_related($this, $relation_name, $query_params, $field_to_sum); |
|
| 2136 | - } |
|
| 2137 | - |
|
| 2138 | - |
|
| 2139 | - |
|
| 2140 | - /** |
|
| 2141 | - * Gets the first (ie, one) related model object of the specified type. |
|
| 2142 | - * |
|
| 2143 | - * @param string $relationName key in the model's _model_relations array |
|
| 2144 | - * @param array $query_params like EEM_Base::get_all |
|
| 2145 | - * @return EE_Base_Class (not an array, a single object) |
|
| 2146 | - * @throws \EE_Error |
|
| 2147 | - */ |
|
| 2148 | - public function get_first_related($relationName, $query_params = array()) |
|
| 2149 | - { |
|
| 2150 | - if ($this->ID()) {//this exists in the DB, get from the cache OR the DB |
|
| 2151 | - //if they've provided some query parameters, don't bother trying to cache the result |
|
| 2152 | - //also make sure we're not caching the result of get_first_related |
|
| 2153 | - //on a relation which should have an array of objects (because the cache might have an array of objects) |
|
| 2154 | - if ($query_params |
|
| 2155 | - || ! $this->get_model()->related_settings_for($relationName) |
|
| 2156 | - instanceof |
|
| 2157 | - EE_Belongs_To_Relation |
|
| 2158 | - ) { |
|
| 2159 | - $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2160 | - } else { |
|
| 2161 | - //first, check if we've already cached the result of this query |
|
| 2162 | - $cached_result = $this->get_one_from_cache($relationName); |
|
| 2163 | - if ( ! $cached_result) { |
|
| 2164 | - $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2165 | - $this->cache($relationName, $related_model_object); |
|
| 2166 | - } else { |
|
| 2167 | - $related_model_object = $cached_result; |
|
| 2168 | - } |
|
| 2169 | - } |
|
| 2170 | - } else { |
|
| 2171 | - $related_model_object = null; |
|
| 2172 | - //this doesn't exist in the Db, but maybe the relation is of type belongs to, and so the related thing might |
|
| 2173 | - if ($this->get_model()->related_settings_for($relationName) instanceof EE_Belongs_To_Relation) { |
|
| 2174 | - $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2175 | - } |
|
| 2176 | - //this doesn't exist in the DB and apparently the thing it belongs to doesn't either, just get what's cached on this object |
|
| 2177 | - if ( ! $related_model_object) { |
|
| 2178 | - $related_model_object = $this->get_one_from_cache($relationName); |
|
| 2179 | - } |
|
| 2180 | - } |
|
| 2181 | - return $related_model_object; |
|
| 2182 | - } |
|
| 2183 | - |
|
| 2184 | - |
|
| 2185 | - |
|
| 2186 | - /** |
|
| 2187 | - * Does a delete on all related objects of type $relationName and removes |
|
| 2188 | - * the current model object's relation to them. If they can't be deleted (because |
|
| 2189 | - * of blocking related model objects) does nothing. If the related model objects are |
|
| 2190 | - * soft-deletable, they will be soft-deleted regardless of related blocking model objects. |
|
| 2191 | - * If this model object doesn't exist yet in the DB, just removes its related things |
|
| 2192 | - * |
|
| 2193 | - * @param string $relationName |
|
| 2194 | - * @param array $query_params like EEM_Base::get_all's |
|
| 2195 | - * @return int how many deleted |
|
| 2196 | - * @throws \EE_Error |
|
| 2197 | - */ |
|
| 2198 | - public function delete_related($relationName, $query_params = array()) |
|
| 2199 | - { |
|
| 2200 | - if ($this->ID()) { |
|
| 2201 | - $count = $this->get_model()->delete_related($this, $relationName, $query_params); |
|
| 2202 | - } else { |
|
| 2203 | - $count = count($this->get_all_from_cache($relationName)); |
|
| 2204 | - $this->clear_cache($relationName, null, true); |
|
| 2205 | - } |
|
| 2206 | - return $count; |
|
| 2207 | - } |
|
| 2208 | - |
|
| 2209 | - |
|
| 2210 | - |
|
| 2211 | - /** |
|
| 2212 | - * Does a hard delete (ie, removes the DB row) on all related objects of type $relationName and removes |
|
| 2213 | - * the current model object's relation to them. If they can't be deleted (because |
|
| 2214 | - * of blocking related model objects) just does a soft delete on it instead, if possible. |
|
| 2215 | - * If the related thing isn't a soft-deletable model object, this function is identical |
|
| 2216 | - * to delete_related(). If this model object doesn't exist in the DB, just remove its related things |
|
| 2217 | - * |
|
| 2218 | - * @param string $relationName |
|
| 2219 | - * @param array $query_params like EEM_Base::get_all's |
|
| 2220 | - * @return int how many deleted (including those soft deleted) |
|
| 2221 | - * @throws \EE_Error |
|
| 2222 | - */ |
|
| 2223 | - public function delete_related_permanently($relationName, $query_params = array()) |
|
| 2224 | - { |
|
| 2225 | - if ($this->ID()) { |
|
| 2226 | - $count = $this->get_model()->delete_related_permanently($this, $relationName, $query_params); |
|
| 2227 | - } else { |
|
| 2228 | - $count = count($this->get_all_from_cache($relationName)); |
|
| 2229 | - } |
|
| 2230 | - $this->clear_cache($relationName, null, true); |
|
| 2231 | - return $count; |
|
| 2232 | - } |
|
| 2233 | - |
|
| 2234 | - |
|
| 2235 | - |
|
| 2236 | - /** |
|
| 2237 | - * is_set |
|
| 2238 | - * Just a simple utility function children can use for checking if property exists |
|
| 2239 | - * |
|
| 2240 | - * @access public |
|
| 2241 | - * @param string $field_name property to check |
|
| 2242 | - * @return bool TRUE if existing,FALSE if not. |
|
| 2243 | - */ |
|
| 2244 | - public function is_set($field_name) |
|
| 2245 | - { |
|
| 2246 | - return isset($this->_fields[$field_name]); |
|
| 2247 | - } |
|
| 2248 | - |
|
| 2249 | - |
|
| 2250 | - |
|
| 2251 | - /** |
|
| 2252 | - * Just a simple utility function children can use for checking if property (or properties) exists and throwing an |
|
| 2253 | - * EE_Error exception if they don't |
|
| 2254 | - * |
|
| 2255 | - * @param mixed (string|array) $properties properties to check |
|
| 2256 | - * @throws EE_Error |
|
| 2257 | - * @return bool TRUE if existing, throw EE_Error if not. |
|
| 2258 | - */ |
|
| 2259 | - protected function _property_exists($properties) |
|
| 2260 | - { |
|
| 2261 | - foreach ((array)$properties as $property_name) { |
|
| 2262 | - //first make sure this property exists |
|
| 2263 | - if ( ! $this->_fields[$property_name]) { |
|
| 2264 | - throw new EE_Error( |
|
| 2265 | - sprintf( |
|
| 2266 | - __( |
|
| 2267 | - 'Trying to retrieve a non-existent property (%s). Double check the spelling please', |
|
| 2268 | - 'event_espresso' |
|
| 2269 | - ), |
|
| 2270 | - $property_name |
|
| 2271 | - ) |
|
| 2272 | - ); |
|
| 2273 | - } |
|
| 2274 | - } |
|
| 2275 | - return true; |
|
| 2276 | - } |
|
| 2277 | - |
|
| 2278 | - |
|
| 2279 | - |
|
| 2280 | - /** |
|
| 2281 | - * This simply returns an array of model fields for this object |
|
| 2282 | - * |
|
| 2283 | - * @return array |
|
| 2284 | - * @throws \EE_Error |
|
| 2285 | - */ |
|
| 2286 | - public function model_field_array() |
|
| 2287 | - { |
|
| 2288 | - $fields = $this->get_model()->field_settings(false); |
|
| 2289 | - $properties = array(); |
|
| 2290 | - //remove prepended underscore |
|
| 2291 | - foreach ($fields as $field_name => $settings) { |
|
| 2292 | - $properties[$field_name] = $this->get($field_name); |
|
| 2293 | - } |
|
| 2294 | - return $properties; |
|
| 2295 | - } |
|
| 2296 | - |
|
| 2297 | - |
|
| 2298 | - |
|
| 2299 | - /** |
|
| 2300 | - * Very handy general function to allow for plugins to extend any child of EE_Base_Class. |
|
| 2301 | - * If a method is called on a child of EE_Base_Class that doesn't exist, this function is called |
|
| 2302 | - * (http://www.garfieldtech.com/blog/php-magic-call) and passed the method's name and arguments. Instead of |
|
| 2303 | - * requiring a plugin to extend the EE_Base_Class (which works fine is there's only 1 plugin, but when will that |
|
| 2304 | - * happen?) they can add a hook onto 'filters_hook_espresso__{className}__{methodName}' (eg, |
|
| 2305 | - * filters_hook_espresso__EE_Answer__my_great_function) and accepts 2 arguments: the object on which the function |
|
| 2306 | - * was called, and an array of the original arguments passed to the function. Whatever their callback function |
|
| 2307 | - * returns will be returned by this function. Example: in functions.php (or in a plugin): |
|
| 2308 | - * add_filter('FHEE__EE_Answer__my_callback','my_callback',10,3); function |
|
| 2309 | - * my_callback($previousReturnValue,EE_Base_Class $object,$argsArray){ |
|
| 2310 | - * $returnString= "you called my_callback! and passed args:".implode(",",$argsArray); |
|
| 2311 | - * return $previousReturnValue.$returnString; |
|
| 2312 | - * } |
|
| 2313 | - * require('EE_Answer.class.php'); |
|
| 2314 | - * $answer= EE_Answer::new_instance(array('REG_ID' => 2,'QST_ID' => 3,'ANS_value' => The answer is 42')); |
|
| 2315 | - * echo $answer->my_callback('monkeys',100); |
|
| 2316 | - * //will output "you called my_callback! and passed args:monkeys,100" |
|
| 2317 | - * |
|
| 2318 | - * @param string $methodName name of method which was called on a child of EE_Base_Class, but which |
|
| 2319 | - * @param array $args array of original arguments passed to the function |
|
| 2320 | - * @throws EE_Error |
|
| 2321 | - * @return mixed whatever the plugin which calls add_filter decides |
|
| 2322 | - */ |
|
| 2323 | - public function __call($methodName, $args) |
|
| 2324 | - { |
|
| 2325 | - $className = get_class($this); |
|
| 2326 | - $tagName = "FHEE__{$className}__{$methodName}"; |
|
| 2327 | - if ( ! has_filter($tagName)) { |
|
| 2328 | - throw new EE_Error( |
|
| 2329 | - sprintf( |
|
| 2330 | - __( |
|
| 2331 | - "Method %s on class %s does not exist! You can create one with the following code in functions.php or in a plugin: add_filter('%s','my_callback',10,3);function my_callback(\$previousReturnValue,EE_Base_Class \$object, \$argsArray){/*function body*/return \$whatever;}", |
|
| 2332 | - "event_espresso" |
|
| 2333 | - ), |
|
| 2334 | - $methodName, |
|
| 2335 | - $className, |
|
| 2336 | - $tagName |
|
| 2337 | - ) |
|
| 2338 | - ); |
|
| 2339 | - } |
|
| 2340 | - return apply_filters($tagName, null, $this, $args); |
|
| 2341 | - } |
|
| 2342 | - |
|
| 2343 | - |
|
| 2344 | - |
|
| 2345 | - /** |
|
| 2346 | - * Similar to insert_post_meta, adds a record in the Extra_Meta model's table with the given key and value. |
|
| 2347 | - * A $previous_value can be specified in case there are many meta rows with the same key |
|
| 2348 | - * |
|
| 2349 | - * @param string $meta_key |
|
| 2350 | - * @param string $meta_value |
|
| 2351 | - * @param string $previous_value |
|
| 2352 | - * @return int records updated (or BOOLEAN if we actually ended up inserting the extra meta row) |
|
| 2353 | - * @throws \EE_Error |
|
| 2354 | - * NOTE: if the values haven't changed, returns 0 |
|
| 2355 | - */ |
|
| 2356 | - public function update_extra_meta($meta_key, $meta_value, $previous_value = null) |
|
| 2357 | - { |
|
| 2358 | - $query_params = array( |
|
| 2359 | - array( |
|
| 2360 | - 'EXM_key' => $meta_key, |
|
| 2361 | - 'OBJ_ID' => $this->ID(), |
|
| 2362 | - 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2363 | - ), |
|
| 2364 | - ); |
|
| 2365 | - if ($previous_value !== null) { |
|
| 2366 | - $query_params[0]['EXM_value'] = $meta_value; |
|
| 2367 | - } |
|
| 2368 | - $existing_rows_like_that = EEM_Extra_Meta::instance()->get_all($query_params); |
|
| 2369 | - if ( ! $existing_rows_like_that) { |
|
| 2370 | - return $this->add_extra_meta($meta_key, $meta_value); |
|
| 2371 | - } else { |
|
| 2372 | - foreach ($existing_rows_like_that as $existing_row) { |
|
| 2373 | - $existing_row->save(array('EXM_value' => $meta_value)); |
|
| 2374 | - } |
|
| 2375 | - return count($existing_rows_like_that); |
|
| 2376 | - } |
|
| 2377 | - } |
|
| 2378 | - |
|
| 2379 | - |
|
| 2380 | - |
|
| 2381 | - /** |
|
| 2382 | - * Adds a new extra meta record. If $unique is set to TRUE, we'll first double-check |
|
| 2383 | - * no other extra meta for this model object have the same key. Returns TRUE if the |
|
| 2384 | - * extra meta row was entered, false if not |
|
| 2385 | - * |
|
| 2386 | - * @param string $meta_key |
|
| 2387 | - * @param string $meta_value |
|
| 2388 | - * @param boolean $unique |
|
| 2389 | - * @return boolean |
|
| 2390 | - * @throws \EE_Error |
|
| 2391 | - */ |
|
| 2392 | - public function add_extra_meta($meta_key, $meta_value, $unique = false) |
|
| 2393 | - { |
|
| 2394 | - if ($unique) { |
|
| 2395 | - $existing_extra_meta = EEM_Extra_Meta::instance()->get_one( |
|
| 2396 | - array( |
|
| 2397 | - array( |
|
| 2398 | - 'EXM_key' => $meta_key, |
|
| 2399 | - 'OBJ_ID' => $this->ID(), |
|
| 2400 | - 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2401 | - ), |
|
| 2402 | - ) |
|
| 2403 | - ); |
|
| 2404 | - if ($existing_extra_meta) { |
|
| 2405 | - return false; |
|
| 2406 | - } |
|
| 2407 | - } |
|
| 2408 | - $new_extra_meta = EE_Extra_Meta::new_instance( |
|
| 2409 | - array( |
|
| 2410 | - 'EXM_key' => $meta_key, |
|
| 2411 | - 'EXM_value' => $meta_value, |
|
| 2412 | - 'OBJ_ID' => $this->ID(), |
|
| 2413 | - 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2414 | - ) |
|
| 2415 | - ); |
|
| 2416 | - $new_extra_meta->save(); |
|
| 2417 | - return true; |
|
| 2418 | - } |
|
| 2419 | - |
|
| 2420 | - |
|
| 2421 | - |
|
| 2422 | - /** |
|
| 2423 | - * Deletes all the extra meta rows for this record as specified by key. If $meta_value |
|
| 2424 | - * is specified, only deletes extra meta records with that value. |
|
| 2425 | - * |
|
| 2426 | - * @param string $meta_key |
|
| 2427 | - * @param string $meta_value |
|
| 2428 | - * @return int number of extra meta rows deleted |
|
| 2429 | - * @throws \EE_Error |
|
| 2430 | - */ |
|
| 2431 | - public function delete_extra_meta($meta_key, $meta_value = null) |
|
| 2432 | - { |
|
| 2433 | - $query_params = array( |
|
| 2434 | - array( |
|
| 2435 | - 'EXM_key' => $meta_key, |
|
| 2436 | - 'OBJ_ID' => $this->ID(), |
|
| 2437 | - 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2438 | - ), |
|
| 2439 | - ); |
|
| 2440 | - if ($meta_value !== null) { |
|
| 2441 | - $query_params[0]['EXM_value'] = $meta_value; |
|
| 2442 | - } |
|
| 2443 | - return EEM_Extra_Meta::instance()->delete($query_params); |
|
| 2444 | - } |
|
| 2445 | - |
|
| 2446 | - |
|
| 2447 | - |
|
| 2448 | - /** |
|
| 2449 | - * Gets the extra meta with the given meta key. If you specify "single" we just return 1, otherwise |
|
| 2450 | - * an array of everything found. Requires that this model actually have a relation of type EE_Has_Many_Any_Relation. |
|
| 2451 | - * You can specify $default is case you haven't found the extra meta |
|
| 2452 | - * |
|
| 2453 | - * @param string $meta_key |
|
| 2454 | - * @param boolean $single |
|
| 2455 | - * @param mixed $default if we don't find anything, what should we return? |
|
| 2456 | - * @return mixed single value if $single; array if ! $single |
|
| 2457 | - * @throws \EE_Error |
|
| 2458 | - */ |
|
| 2459 | - public function get_extra_meta($meta_key, $single = false, $default = null) |
|
| 2460 | - { |
|
| 2461 | - if ($single) { |
|
| 2462 | - $result = $this->get_first_related('Extra_Meta', array(array('EXM_key' => $meta_key))); |
|
| 2463 | - if ($result instanceof EE_Extra_Meta) { |
|
| 2464 | - return $result->value(); |
|
| 2465 | - } else { |
|
| 2466 | - return $default; |
|
| 2467 | - } |
|
| 2468 | - } else { |
|
| 2469 | - $results = $this->get_many_related('Extra_Meta', array(array('EXM_key' => $meta_key))); |
|
| 2470 | - if ($results) { |
|
| 2471 | - $values = array(); |
|
| 2472 | - foreach ($results as $result) { |
|
| 2473 | - if ($result instanceof EE_Extra_Meta) { |
|
| 2474 | - $values[$result->ID()] = $result->value(); |
|
| 2475 | - } |
|
| 2476 | - } |
|
| 2477 | - return $values; |
|
| 2478 | - } else { |
|
| 2479 | - return $default; |
|
| 2480 | - } |
|
| 2481 | - } |
|
| 2482 | - } |
|
| 2483 | - |
|
| 2484 | - |
|
| 2485 | - |
|
| 2486 | - /** |
|
| 2487 | - * Returns a simple array of all the extra meta associated with this model object. |
|
| 2488 | - * If $one_of_each_key is true (Default), it will be an array of simple key-value pairs, keys being the |
|
| 2489 | - * extra meta's key, and teh value being its value. However, if there are duplicate extra meta rows with |
|
| 2490 | - * the same key, only one will be used. (eg array('foo'=>'bar','monkey'=>123)) |
|
| 2491 | - * If $one_of_each_key is false, it will return an array with the top-level keys being |
|
| 2492 | - * the extra meta keys, but their values are also arrays, which have the extra-meta's ID as their sub-key, and |
|
| 2493 | - * finally the extra meta's value as each sub-value. (eg |
|
| 2494 | - * array('foo'=>array(1=>'bar',2=>'bill'),'monkey'=>array(3=>123))) |
|
| 2495 | - * |
|
| 2496 | - * @param boolean $one_of_each_key |
|
| 2497 | - * @return array |
|
| 2498 | - * @throws \EE_Error |
|
| 2499 | - */ |
|
| 2500 | - public function all_extra_meta_array($one_of_each_key = true) |
|
| 2501 | - { |
|
| 2502 | - $return_array = array(); |
|
| 2503 | - if ($one_of_each_key) { |
|
| 2504 | - $extra_meta_objs = $this->get_many_related('Extra_Meta', array('group_by' => 'EXM_key')); |
|
| 2505 | - foreach ($extra_meta_objs as $extra_meta_obj) { |
|
| 2506 | - if ($extra_meta_obj instanceof EE_Extra_Meta) { |
|
| 2507 | - $return_array[$extra_meta_obj->key()] = $extra_meta_obj->value(); |
|
| 2508 | - } |
|
| 2509 | - } |
|
| 2510 | - } else { |
|
| 2511 | - $extra_meta_objs = $this->get_many_related('Extra_Meta'); |
|
| 2512 | - foreach ($extra_meta_objs as $extra_meta_obj) { |
|
| 2513 | - if ($extra_meta_obj instanceof EE_Extra_Meta) { |
|
| 2514 | - if ( ! isset($return_array[$extra_meta_obj->key()])) { |
|
| 2515 | - $return_array[$extra_meta_obj->key()] = array(); |
|
| 2516 | - } |
|
| 2517 | - $return_array[$extra_meta_obj->key()][$extra_meta_obj->ID()] = $extra_meta_obj->value(); |
|
| 2518 | - } |
|
| 2519 | - } |
|
| 2520 | - } |
|
| 2521 | - return $return_array; |
|
| 2522 | - } |
|
| 2523 | - |
|
| 2524 | - |
|
| 2525 | - |
|
| 2526 | - /** |
|
| 2527 | - * Gets a pretty nice displayable nice for this model object. Often overridden |
|
| 2528 | - * |
|
| 2529 | - * @return string |
|
| 2530 | - * @throws \EE_Error |
|
| 2531 | - */ |
|
| 2532 | - public function name() |
|
| 2533 | - { |
|
| 2534 | - //find a field that's not a text field |
|
| 2535 | - $field_we_can_use = $this->get_model()->get_a_field_of_type('EE_Text_Field_Base'); |
|
| 2536 | - if ($field_we_can_use) { |
|
| 2537 | - return $this->get($field_we_can_use->get_name()); |
|
| 2538 | - } else { |
|
| 2539 | - $first_few_properties = $this->model_field_array(); |
|
| 2540 | - $first_few_properties = array_slice($first_few_properties, 0, 3); |
|
| 2541 | - $name_parts = array(); |
|
| 2542 | - foreach ($first_few_properties as $name => $value) { |
|
| 2543 | - $name_parts[] = "$name:$value"; |
|
| 2544 | - } |
|
| 2545 | - return implode(",", $name_parts); |
|
| 2546 | - } |
|
| 2547 | - } |
|
| 2548 | - |
|
| 2549 | - |
|
| 2550 | - |
|
| 2551 | - /** |
|
| 2552 | - * in_entity_map |
|
| 2553 | - * Checks if this model object has been proven to already be in the entity map |
|
| 2554 | - * |
|
| 2555 | - * @return boolean |
|
| 2556 | - * @throws \EE_Error |
|
| 2557 | - */ |
|
| 2558 | - public function in_entity_map() |
|
| 2559 | - { |
|
| 2560 | - if ($this->ID() && $this->get_model()->get_from_entity_map($this->ID()) === $this) { |
|
| 2561 | - //well, if we looked, did we find it in the entity map? |
|
| 2562 | - return true; |
|
| 2563 | - } else { |
|
| 2564 | - return false; |
|
| 2565 | - } |
|
| 2566 | - } |
|
| 2567 | - |
|
| 2568 | - |
|
| 2569 | - |
|
| 2570 | - /** |
|
| 2571 | - * refresh_from_db |
|
| 2572 | - * Makes sure the fields and values on this model object are in-sync with what's in the database. |
|
| 2573 | - * |
|
| 2574 | - * @throws EE_Error if this model object isn't in the entity mapper (because then you should |
|
| 2575 | - * just use what's in the entity mapper and refresh it) and WP_DEBUG is TRUE |
|
| 2576 | - */ |
|
| 2577 | - public function refresh_from_db() |
|
| 2578 | - { |
|
| 2579 | - if ($this->ID() && $this->in_entity_map()) { |
|
| 2580 | - $this->get_model()->refresh_entity_map_from_db($this->ID()); |
|
| 2581 | - } else { |
|
| 2582 | - //if it doesn't have ID, you shouldn't be asking to refresh it from teh database (because its not in the database) |
|
| 2583 | - //if it has an ID but it's not in the map, and you're asking me to refresh it |
|
| 2584 | - //that's kinda dangerous. You should just use what's in the entity map, or add this to the entity map if there's |
|
| 2585 | - //absolutely nothing in it for this ID |
|
| 2586 | - if (WP_DEBUG) { |
|
| 2587 | - throw new EE_Error( |
|
| 2588 | - sprintf( |
|
| 2589 | - __('Trying to refresh a model object with ID "%1$s" that\'s not in the entity map? First off: you should put it in the entity map by calling %2$s. Second off, if you want what\'s in the database right now, you should just call %3$s yourself and discard this model object.', |
|
| 2590 | - 'event_espresso'), |
|
| 2591 | - $this->ID(), |
|
| 2592 | - get_class($this->get_model()) . '::instance()->add_to_entity_map()', |
|
| 2593 | - get_class($this->get_model()) . '::instance()->refresh_entity_map()' |
|
| 2594 | - ) |
|
| 2595 | - ); |
|
| 2596 | - } |
|
| 2597 | - } |
|
| 2598 | - } |
|
| 2599 | - |
|
| 2600 | - |
|
| 2601 | - |
|
| 2602 | - /** |
|
| 2603 | - * Because some other plugins, like Advanced Cron Manager, expect all objects to have this method |
|
| 2604 | - * (probably a bad assumption they have made, oh well) |
|
| 2605 | - * |
|
| 2606 | - * @return string |
|
| 2607 | - */ |
|
| 2608 | - public function __toString() |
|
| 2609 | - { |
|
| 2610 | - try { |
|
| 2611 | - return sprintf('%s (%s)', $this->name(), $this->ID()); |
|
| 2612 | - } catch (Exception $e) { |
|
| 2613 | - EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
| 2614 | - return ''; |
|
| 2615 | - } |
|
| 2616 | - } |
|
| 2617 | - |
|
| 2618 | - |
|
| 2619 | - |
|
| 2620 | - /** |
|
| 2621 | - * Clear related model objects if they're already in the DB, because otherwise when we |
|
| 2622 | - * UN-serialize this model object we'll need to be careful to add them to the entity map. |
|
| 2623 | - * This means if we have made changes to those related model objects, and want to unserialize |
|
| 2624 | - * the this model object on a subsequent request, changes to those related model objects will be lost. |
|
| 2625 | - * Instead, those related model objects should be directly serialized and stored. |
|
| 2626 | - * Eg, the following won't work: |
|
| 2627 | - * $reg = EEM_Registration::instance()->get_one_by_ID( 123 ); |
|
| 2628 | - * $att = $reg->attendee(); |
|
| 2629 | - * $att->set( 'ATT_fname', 'Dirk' ); |
|
| 2630 | - * update_option( 'my_option', serialize( $reg ) ); |
|
| 2631 | - * //END REQUEST |
|
| 2632 | - * //START NEXT REQUEST |
|
| 2633 | - * $reg = get_option( 'my_option' ); |
|
| 2634 | - * $reg->attendee()->save(); |
|
| 2635 | - * And would need to be replace with: |
|
| 2636 | - * $reg = EEM_Registration::instance()->get_one_by_ID( 123 ); |
|
| 2637 | - * $att = $reg->attendee(); |
|
| 2638 | - * $att->set( 'ATT_fname', 'Dirk' ); |
|
| 2639 | - * update_option( 'my_option', serialize( $reg ) ); |
|
| 2640 | - * //END REQUEST |
|
| 2641 | - * //START NEXT REQUEST |
|
| 2642 | - * $att = get_option( 'my_option' ); |
|
| 2643 | - * $att->save(); |
|
| 2644 | - * |
|
| 2645 | - * @return array |
|
| 2646 | - * @throws \EE_Error |
|
| 2647 | - */ |
|
| 2648 | - public function __sleep() |
|
| 2649 | - { |
|
| 2650 | - foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 2651 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 2652 | - $classname = 'EE_' . $this->get_model()->get_this_model_name(); |
|
| 2653 | - if ( |
|
| 2654 | - $this->get_one_from_cache($relation_name) instanceof $classname |
|
| 2655 | - && $this->get_one_from_cache($relation_name)->ID() |
|
| 2656 | - ) { |
|
| 2657 | - $this->clear_cache($relation_name, $this->get_one_from_cache($relation_name)->ID()); |
|
| 2658 | - } |
|
| 2659 | - } |
|
| 2660 | - } |
|
| 2661 | - $this->_props_n_values_provided_in_constructor = array(); |
|
| 2662 | - return array_keys(get_object_vars($this)); |
|
| 2663 | - } |
|
| 2664 | - |
|
| 2665 | - |
|
| 2666 | - |
|
| 2667 | - /** |
|
| 2668 | - * restore _props_n_values_provided_in_constructor |
|
| 2669 | - * PLZ NOTE: this will reset the array to whatever fields values were present prior to serialization, |
|
| 2670 | - * and therefore should NOT be used to determine if state change has occurred since initial construction. |
|
| 2671 | - * At best, you would only be able to detect if state change has occurred during THIS request. |
|
| 2672 | - */ |
|
| 2673 | - public function __wakeup() |
|
| 2674 | - { |
|
| 2675 | - $this->_props_n_values_provided_in_constructor = $this->_fields; |
|
| 2676 | - } |
|
| 28 | + /** |
|
| 29 | + * This is an array of the original properties and values provided during construction |
|
| 30 | + * of this model object. (keys are model field names, values are their values). |
|
| 31 | + * This list is important to remember so that when we are merging data from the db, we know |
|
| 32 | + * which values to override and which to not override. |
|
| 33 | + * |
|
| 34 | + * @var array |
|
| 35 | + */ |
|
| 36 | + protected $_props_n_values_provided_in_constructor; |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * Timezone |
|
| 40 | + * This gets set by the "set_timezone()" method so that we know what timezone incoming strings|timestamps are in. |
|
| 41 | + * This can also be used before a get to set what timezone you want strings coming out of the object to be in. NOT |
|
| 42 | + * all EE_Base_Class child classes use this property but any that use a EE_Datetime_Field data type will have |
|
| 43 | + * access to it. |
|
| 44 | + * |
|
| 45 | + * @var string |
|
| 46 | + */ |
|
| 47 | + protected $_timezone; |
|
| 48 | + |
|
| 49 | + |
|
| 50 | + |
|
| 51 | + /** |
|
| 52 | + * date format |
|
| 53 | + * pattern or format for displaying dates |
|
| 54 | + * |
|
| 55 | + * @var string $_dt_frmt |
|
| 56 | + */ |
|
| 57 | + protected $_dt_frmt; |
|
| 58 | + |
|
| 59 | + |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * time format |
|
| 63 | + * pattern or format for displaying time |
|
| 64 | + * |
|
| 65 | + * @var string $_tm_frmt |
|
| 66 | + */ |
|
| 67 | + protected $_tm_frmt; |
|
| 68 | + |
|
| 69 | + |
|
| 70 | + |
|
| 71 | + /** |
|
| 72 | + * This property is for holding a cached array of object properties indexed by property name as the key. |
|
| 73 | + * The purpose of this is for setting a cache on properties that may have calculated values after a |
|
| 74 | + * prepare_for_get. That way the cache can be checked first and the calculated property returned instead of having |
|
| 75 | + * to recalculate. Used by _set_cached_property() and _get_cached_property() methods. |
|
| 76 | + * |
|
| 77 | + * @var array |
|
| 78 | + */ |
|
| 79 | + protected $_cached_properties = array(); |
|
| 80 | + |
|
| 81 | + /** |
|
| 82 | + * An array containing keys of the related model, and values are either an array of related mode objects or a |
|
| 83 | + * single |
|
| 84 | + * related model object. see the model's _model_relations. The keys should match those specified. And if the |
|
| 85 | + * relation is of type EE_Belongs_To (or one of its children), then there should only be ONE related model object, |
|
| 86 | + * all others have an array) |
|
| 87 | + * |
|
| 88 | + * @var array |
|
| 89 | + */ |
|
| 90 | + protected $_model_relations = array(); |
|
| 91 | + |
|
| 92 | + /** |
|
| 93 | + * Array where keys are field names (see the model's _fields property) and values are their values. To see what |
|
| 94 | + * their types should be, look at what that field object returns on its prepare_for_get and prepare_for_set methods) |
|
| 95 | + * |
|
| 96 | + * @var array |
|
| 97 | + */ |
|
| 98 | + protected $_fields = array(); |
|
| 99 | + |
|
| 100 | + /** |
|
| 101 | + * @var boolean indicating whether or not this model object is intended to ever be saved |
|
| 102 | + * For example, we might create model objects intended to only be used for the duration |
|
| 103 | + * of this request and to be thrown away, and if they were accidentally saved |
|
| 104 | + * it would be a bug. |
|
| 105 | + */ |
|
| 106 | + protected $_allow_persist = true; |
|
| 107 | + |
|
| 108 | + |
|
| 109 | + |
|
| 110 | + /** |
|
| 111 | + * basic constructor for Event Espresso classes, performs any necessary initialization, and verifies it's children |
|
| 112 | + * play nice |
|
| 113 | + * |
|
| 114 | + * @param array $fieldValues where each key is a field (ie, array key in the 2nd |
|
| 115 | + * layer of the model's _fields array, (eg, EVT_ID, |
|
| 116 | + * TXN_amount, QST_name, etc) and values are their values |
|
| 117 | + * @param boolean $bydb a flag for setting if the class is instantiated by the |
|
| 118 | + * corresponding db model or not. |
|
| 119 | + * @param string $timezone indicate what timezone you want any datetime fields to |
|
| 120 | + * be in when instantiating a EE_Base_Class object. |
|
| 121 | + * @param array $date_formats An array of date formats to set on construct where first |
|
| 122 | + * value is the date_format and second value is the time |
|
| 123 | + * format. |
|
| 124 | + * @throws EE_Error |
|
| 125 | + */ |
|
| 126 | + protected function __construct($fieldValues = array(), $bydb = false, $timezone = '', $date_formats = array()) |
|
| 127 | + { |
|
| 128 | + $className = get_class($this); |
|
| 129 | + do_action("AHEE__{$className}__construct", $this, $fieldValues); |
|
| 130 | + $model = $this->get_model(); |
|
| 131 | + $model_fields = $model->field_settings(false); |
|
| 132 | + // ensure $fieldValues is an array |
|
| 133 | + $fieldValues = is_array($fieldValues) ? $fieldValues : array($fieldValues); |
|
| 134 | + // EEH_Debug_Tools::printr( $fieldValues, '$fieldValues <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' ); |
|
| 135 | + // verify client code has not passed any invalid field names |
|
| 136 | + foreach ($fieldValues as $field_name => $field_value) { |
|
| 137 | + if ( ! isset($model_fields[$field_name])) { |
|
| 138 | + throw new EE_Error(sprintf(__("Invalid field (%s) passed to constructor of %s. Allowed fields are :%s", |
|
| 139 | + "event_espresso"), $field_name, get_class($this), implode(", ", array_keys($model_fields)))); |
|
| 140 | + } |
|
| 141 | + } |
|
| 142 | + // EEH_Debug_Tools::printr( $model_fields, '$model_fields <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' ); |
|
| 143 | + $this->_timezone = EEH_DTT_Helper::get_valid_timezone_string($timezone); |
|
| 144 | + if ( ! empty($date_formats) && is_array($date_formats)) { |
|
| 145 | + list($this->_dt_frmt, $this->_tm_frmt) = $date_formats; |
|
| 146 | + } else { |
|
| 147 | + //set default formats for date and time |
|
| 148 | + $this->_dt_frmt = (string)get_option('date_format', 'Y-m-d'); |
|
| 149 | + $this->_tm_frmt = (string)get_option('time_format', 'g:i a'); |
|
| 150 | + } |
|
| 151 | + //if db model is instantiating |
|
| 152 | + if ($bydb) { |
|
| 153 | + //client code has indicated these field values are from the database |
|
| 154 | + foreach ($model_fields as $fieldName => $field) { |
|
| 155 | + $this->set_from_db($fieldName, isset($fieldValues[$fieldName]) ? $fieldValues[$fieldName] : null); |
|
| 156 | + } |
|
| 157 | + } else { |
|
| 158 | + //we're constructing a brand |
|
| 159 | + //new instance of the model object. Generally, this means we'll need to do more field validation |
|
| 160 | + foreach ($model_fields as $fieldName => $field) { |
|
| 161 | + $this->set($fieldName, isset($fieldValues[$fieldName]) ? $fieldValues[$fieldName] : null, true); |
|
| 162 | + } |
|
| 163 | + } |
|
| 164 | + //remember what values were passed to this constructor |
|
| 165 | + $this->_props_n_values_provided_in_constructor = $fieldValues; |
|
| 166 | + //remember in entity mapper |
|
| 167 | + if ( ! $bydb && $model->has_primary_key_field() && $this->ID()) { |
|
| 168 | + $model->add_to_entity_map($this); |
|
| 169 | + } |
|
| 170 | + //setup all the relations |
|
| 171 | + foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 172 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 173 | + $this->_model_relations[$relation_name] = null; |
|
| 174 | + } else { |
|
| 175 | + $this->_model_relations[$relation_name] = array(); |
|
| 176 | + } |
|
| 177 | + } |
|
| 178 | + /** |
|
| 179 | + * Action done at the end of each model object construction |
|
| 180 | + * |
|
| 181 | + * @param EE_Base_Class $this the model object just created |
|
| 182 | + */ |
|
| 183 | + do_action('AHEE__EE_Base_Class__construct__finished', $this); |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + |
|
| 187 | + |
|
| 188 | + /** |
|
| 189 | + * Gets whether or not this model object is allowed to persist/be saved to the database. |
|
| 190 | + * |
|
| 191 | + * @return boolean |
|
| 192 | + */ |
|
| 193 | + public function allow_persist() |
|
| 194 | + { |
|
| 195 | + return $this->_allow_persist; |
|
| 196 | + } |
|
| 197 | + |
|
| 198 | + |
|
| 199 | + |
|
| 200 | + /** |
|
| 201 | + * Sets whether or not this model object should be allowed to be saved to the DB. |
|
| 202 | + * Normally once this is set to FALSE you wouldn't set it back to TRUE, unless |
|
| 203 | + * you got new information that somehow made you change your mind. |
|
| 204 | + * |
|
| 205 | + * @param boolean $allow_persist |
|
| 206 | + * @return boolean |
|
| 207 | + */ |
|
| 208 | + public function set_allow_persist($allow_persist) |
|
| 209 | + { |
|
| 210 | + return $this->_allow_persist = $allow_persist; |
|
| 211 | + } |
|
| 212 | + |
|
| 213 | + |
|
| 214 | + |
|
| 215 | + /** |
|
| 216 | + * Gets the field's original value when this object was constructed during this request. |
|
| 217 | + * This can be helpful when determining if a model object has changed or not |
|
| 218 | + * |
|
| 219 | + * @param string $field_name |
|
| 220 | + * @return mixed|null |
|
| 221 | + * @throws \EE_Error |
|
| 222 | + */ |
|
| 223 | + public function get_original($field_name) |
|
| 224 | + { |
|
| 225 | + if (isset($this->_props_n_values_provided_in_constructor[$field_name]) |
|
| 226 | + && $field_settings = $this->get_model()->field_settings_for($field_name) |
|
| 227 | + ) { |
|
| 228 | + return $field_settings->prepare_for_get($this->_props_n_values_provided_in_constructor[$field_name]); |
|
| 229 | + } else { |
|
| 230 | + return null; |
|
| 231 | + } |
|
| 232 | + } |
|
| 233 | + |
|
| 234 | + |
|
| 235 | + |
|
| 236 | + /** |
|
| 237 | + * @param EE_Base_Class $obj |
|
| 238 | + * @return string |
|
| 239 | + */ |
|
| 240 | + public function get_class($obj) |
|
| 241 | + { |
|
| 242 | + return get_class($obj); |
|
| 243 | + } |
|
| 244 | + |
|
| 245 | + |
|
| 246 | + |
|
| 247 | + /** |
|
| 248 | + * Overrides parent because parent expects old models. |
|
| 249 | + * This also doesn't do any validation, and won't work for serialized arrays |
|
| 250 | + * |
|
| 251 | + * @param string $field_name |
|
| 252 | + * @param mixed $field_value |
|
| 253 | + * @param bool $use_default |
|
| 254 | + * @throws \EE_Error |
|
| 255 | + */ |
|
| 256 | + public function set($field_name, $field_value, $use_default = false) |
|
| 257 | + { |
|
| 258 | + $field_obj = $this->get_model()->field_settings_for($field_name); |
|
| 259 | + if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 260 | + // if ( method_exists( $field_obj, 'set_timezone' )) { |
|
| 261 | + if ($field_obj instanceof EE_Datetime_Field) { |
|
| 262 | + $field_obj->set_timezone($this->_timezone); |
|
| 263 | + $field_obj->set_date_format($this->_dt_frmt); |
|
| 264 | + $field_obj->set_time_format($this->_tm_frmt); |
|
| 265 | + } |
|
| 266 | + $holder_of_value = $field_obj->prepare_for_set($field_value); |
|
| 267 | + //should the value be null? |
|
| 268 | + if (($field_value === null || $holder_of_value === null || $holder_of_value === '') && $use_default) { |
|
| 269 | + $this->_fields[$field_name] = $field_obj->get_default_value(); |
|
| 270 | + /** |
|
| 271 | + * To save having to refactor all the models, if a default value is used for a |
|
| 272 | + * EE_Datetime_Field, and that value is not null nor is it a DateTime |
|
| 273 | + * object. Then let's do a set again to ensure that it becomes a DateTime |
|
| 274 | + * object. |
|
| 275 | + * |
|
| 276 | + * @since 4.6.10+ |
|
| 277 | + */ |
|
| 278 | + if ( |
|
| 279 | + $field_obj instanceof EE_Datetime_Field |
|
| 280 | + && $this->_fields[$field_name] !== null |
|
| 281 | + && ! $this->_fields[$field_name] instanceof DateTime |
|
| 282 | + ) { |
|
| 283 | + empty($this->_fields[$field_name]) |
|
| 284 | + ? $this->set($field_name, time()) |
|
| 285 | + : $this->set($field_name, $this->_fields[$field_name]); |
|
| 286 | + } |
|
| 287 | + } else { |
|
| 288 | + $this->_fields[$field_name] = $holder_of_value; |
|
| 289 | + } |
|
| 290 | + //if we're not in the constructor... |
|
| 291 | + //now check if what we set was a primary key |
|
| 292 | + if ( |
|
| 293 | + //note: props_n_values_provided_in_constructor is only set at the END of the constructor |
|
| 294 | + $this->_props_n_values_provided_in_constructor |
|
| 295 | + && $field_value |
|
| 296 | + && $field_name === self::_get_primary_key_name(get_class($this)) |
|
| 297 | + ) { |
|
| 298 | + //if so, we want all this object's fields to be filled either with |
|
| 299 | + //what we've explicitly set on this model |
|
| 300 | + //or what we have in the db |
|
| 301 | + // echo "setting primary key!"; |
|
| 302 | + $fields_on_model = self::_get_model(get_class($this))->field_settings(); |
|
| 303 | + $obj_in_db = self::_get_model(get_class($this))->get_one_by_ID($field_value); |
|
| 304 | + foreach ($fields_on_model as $field_obj) { |
|
| 305 | + if ( ! array_key_exists($field_obj->get_name(), $this->_props_n_values_provided_in_constructor) |
|
| 306 | + && $field_obj->get_name() !== $field_name |
|
| 307 | + ) { |
|
| 308 | + $this->set($field_obj->get_name(), $obj_in_db->get($field_obj->get_name())); |
|
| 309 | + } |
|
| 310 | + } |
|
| 311 | + //oh this model object has an ID? well make sure its in the entity mapper |
|
| 312 | + $this->get_model()->add_to_entity_map($this); |
|
| 313 | + } |
|
| 314 | + //let's unset any cache for this field_name from the $_cached_properties property. |
|
| 315 | + $this->_clear_cached_property($field_name); |
|
| 316 | + } else { |
|
| 317 | + throw new EE_Error(sprintf(__("A valid EE_Model_Field_Base could not be found for the given field name: %s", |
|
| 318 | + "event_espresso"), $field_name)); |
|
| 319 | + } |
|
| 320 | + } |
|
| 321 | + |
|
| 322 | + |
|
| 323 | + |
|
| 324 | + /** |
|
| 325 | + * This sets the field value on the db column if it exists for the given $column_name or |
|
| 326 | + * saves it to EE_Extra_Meta if the given $column_name does not match a db column. |
|
| 327 | + * |
|
| 328 | + * @see EE_message::get_column_value for related documentation on the necessity of this method. |
|
| 329 | + * @param string $field_name Must be the exact column name. |
|
| 330 | + * @param mixed $field_value The value to set. |
|
| 331 | + * @return int|bool @see EE_Base_Class::update_extra_meta() for return docs. |
|
| 332 | + * @throws \EE_Error |
|
| 333 | + */ |
|
| 334 | + public function set_field_or_extra_meta($field_name, $field_value) |
|
| 335 | + { |
|
| 336 | + if ($this->get_model()->has_field($field_name)) { |
|
| 337 | + $this->set($field_name, $field_value); |
|
| 338 | + return true; |
|
| 339 | + } else { |
|
| 340 | + //ensure this object is saved first so that extra meta can be properly related. |
|
| 341 | + $this->save(); |
|
| 342 | + return $this->update_extra_meta($field_name, $field_value); |
|
| 343 | + } |
|
| 344 | + } |
|
| 345 | + |
|
| 346 | + |
|
| 347 | + |
|
| 348 | + /** |
|
| 349 | + * This retrieves the value of the db column set on this class or if that's not present |
|
| 350 | + * it will attempt to retrieve from extra_meta if found. |
|
| 351 | + * Example Usage: |
|
| 352 | + * Via EE_Message child class: |
|
| 353 | + * Due to the dynamic nature of the EE_messages system, EE_messengers will always have a "to", |
|
| 354 | + * "from", "subject", and "content" field (as represented in the EE_Message schema), however they may |
|
| 355 | + * also have additional main fields specific to the messenger. The system accommodates those extra |
|
| 356 | + * fields through the EE_Extra_Meta table. This method allows for EE_messengers to retrieve the |
|
| 357 | + * value for those extra fields dynamically via the EE_message object. |
|
| 358 | + * |
|
| 359 | + * @param string $field_name expecting the fully qualified field name. |
|
| 360 | + * @return mixed|null value for the field if found. null if not found. |
|
| 361 | + * @throws \EE_Error |
|
| 362 | + */ |
|
| 363 | + public function get_field_or_extra_meta($field_name) |
|
| 364 | + { |
|
| 365 | + if ($this->get_model()->has_field($field_name)) { |
|
| 366 | + $column_value = $this->get($field_name); |
|
| 367 | + } else { |
|
| 368 | + //This isn't a column in the main table, let's see if it is in the extra meta. |
|
| 369 | + $column_value = $this->get_extra_meta($field_name, true, null); |
|
| 370 | + } |
|
| 371 | + return $column_value; |
|
| 372 | + } |
|
| 373 | + |
|
| 374 | + |
|
| 375 | + |
|
| 376 | + /** |
|
| 377 | + * See $_timezone property for description of what the timezone property is for. This SETS the timezone internally |
|
| 378 | + * for being able to reference what timezone we are running conversions on when converting TO the internal timezone |
|
| 379 | + * (UTC Unix Timestamp) for the object OR when converting FROM the internal timezone (UTC Unix Timestamp). This is |
|
| 380 | + * available to all child classes that may be using the EE_Datetime_Field for a field data type. |
|
| 381 | + * |
|
| 382 | + * @access public |
|
| 383 | + * @param string $timezone A valid timezone string as described by @link http://www.php.net/manual/en/timezones.php |
|
| 384 | + * @return void |
|
| 385 | + * @throws \EE_Error |
|
| 386 | + */ |
|
| 387 | + public function set_timezone($timezone = '') |
|
| 388 | + { |
|
| 389 | + $this->_timezone = EEH_DTT_Helper::get_valid_timezone_string($timezone); |
|
| 390 | + //make sure we clear all cached properties because they won't be relevant now |
|
| 391 | + $this->_clear_cached_properties(); |
|
| 392 | + //make sure we update field settings and the date for all EE_Datetime_Fields |
|
| 393 | + $model_fields = $this->get_model()->field_settings(false); |
|
| 394 | + foreach ($model_fields as $field_name => $field_obj) { |
|
| 395 | + if ($field_obj instanceof EE_Datetime_Field) { |
|
| 396 | + $field_obj->set_timezone($this->_timezone); |
|
| 397 | + if (isset($this->_fields[$field_name]) && $this->_fields[$field_name] instanceof DateTime) { |
|
| 398 | + $this->_fields[$field_name]->setTimezone(new DateTimeZone($this->_timezone)); |
|
| 399 | + } |
|
| 400 | + } |
|
| 401 | + } |
|
| 402 | + } |
|
| 403 | + |
|
| 404 | + |
|
| 405 | + |
|
| 406 | + /** |
|
| 407 | + * This just returns whatever is set for the current timezone. |
|
| 408 | + * |
|
| 409 | + * @access public |
|
| 410 | + * @return string timezone string |
|
| 411 | + */ |
|
| 412 | + public function get_timezone() |
|
| 413 | + { |
|
| 414 | + return $this->_timezone; |
|
| 415 | + } |
|
| 416 | + |
|
| 417 | + |
|
| 418 | + |
|
| 419 | + /** |
|
| 420 | + * This sets the internal date format to what is sent in to be used as the new default for the class |
|
| 421 | + * internally instead of wp set date format options |
|
| 422 | + * |
|
| 423 | + * @since 4.6 |
|
| 424 | + * @param string $format should be a format recognizable by PHP date() functions. |
|
| 425 | + */ |
|
| 426 | + public function set_date_format($format) |
|
| 427 | + { |
|
| 428 | + $this->_dt_frmt = $format; |
|
| 429 | + //clear cached_properties because they won't be relevant now. |
|
| 430 | + $this->_clear_cached_properties(); |
|
| 431 | + } |
|
| 432 | + |
|
| 433 | + |
|
| 434 | + |
|
| 435 | + /** |
|
| 436 | + * This sets the internal time format string to what is sent in to be used as the new default for the |
|
| 437 | + * class internally instead of wp set time format options. |
|
| 438 | + * |
|
| 439 | + * @since 4.6 |
|
| 440 | + * @param string $format should be a format recognizable by PHP date() functions. |
|
| 441 | + */ |
|
| 442 | + public function set_time_format($format) |
|
| 443 | + { |
|
| 444 | + $this->_tm_frmt = $format; |
|
| 445 | + //clear cached_properties because they won't be relevant now. |
|
| 446 | + $this->_clear_cached_properties(); |
|
| 447 | + } |
|
| 448 | + |
|
| 449 | + |
|
| 450 | + |
|
| 451 | + /** |
|
| 452 | + * This returns the current internal set format for the date and time formats. |
|
| 453 | + * |
|
| 454 | + * @param bool $full if true (default), then return the full format. Otherwise will return an array |
|
| 455 | + * where the first value is the date format and the second value is the time format. |
|
| 456 | + * @return mixed string|array |
|
| 457 | + */ |
|
| 458 | + public function get_format($full = true) |
|
| 459 | + { |
|
| 460 | + return $full ? $this->_dt_frmt . ' ' . $this->_tm_frmt : array($this->_dt_frmt, $this->_tm_frmt); |
|
| 461 | + } |
|
| 462 | + |
|
| 463 | + |
|
| 464 | + |
|
| 465 | + /** |
|
| 466 | + * cache |
|
| 467 | + * stores the passed model object on the current model object. |
|
| 468 | + * In certain circumstances, we can use this cached model object instead of querying for another one entirely. |
|
| 469 | + * |
|
| 470 | + * @param string $relationName one of the keys in the _model_relations array on the model. Eg |
|
| 471 | + * 'Registration' associated with this model object |
|
| 472 | + * @param EE_Base_Class $object_to_cache that has a relation to this model object. (Eg, if this is a Transaction, |
|
| 473 | + * that could be a payment or a registration) |
|
| 474 | + * @param null $cache_id a string or number that will be used as the key for any Belongs_To_Many |
|
| 475 | + * items which will be stored in an array on this object |
|
| 476 | + * @throws EE_Error |
|
| 477 | + * @return mixed index into cache, or just TRUE if the relation is of type Belongs_To (because there's only one |
|
| 478 | + * related thing, no array) |
|
| 479 | + */ |
|
| 480 | + public function cache($relationName = '', $object_to_cache = null, $cache_id = null) |
|
| 481 | + { |
|
| 482 | + // its entirely possible that there IS no related object yet in which case there is nothing to cache. |
|
| 483 | + if ( ! $object_to_cache instanceof EE_Base_Class) { |
|
| 484 | + return false; |
|
| 485 | + } |
|
| 486 | + // also get "how" the object is related, or throw an error |
|
| 487 | + if ( ! $relationship_to_model = $this->get_model()->related_settings_for($relationName)) { |
|
| 488 | + throw new EE_Error(sprintf(__('There is no relationship to %s on a %s. Cannot cache it', 'event_espresso'), |
|
| 489 | + $relationName, get_class($this))); |
|
| 490 | + } |
|
| 491 | + // how many things are related ? |
|
| 492 | + if ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 493 | + // if it's a "belongs to" relationship, then there's only one related model object eg, if this is a registration, there's only 1 attendee for it |
|
| 494 | + // so for these model objects just set it to be cached |
|
| 495 | + $this->_model_relations[$relationName] = $object_to_cache; |
|
| 496 | + $return = true; |
|
| 497 | + } else { |
|
| 498 | + // otherwise, this is the "many" side of a one to many relationship, so we'll add the object to the array of related objects for that type. |
|
| 499 | + // eg: if this is an event, there are many registrations for that event, so we cache the registrations in an array |
|
| 500 | + if ( ! is_array($this->_model_relations[$relationName])) { |
|
| 501 | + // if for some reason, the cached item is a model object, then stick that in the array, otherwise start with an empty array |
|
| 502 | + $this->_model_relations[$relationName] = $this->_model_relations[$relationName] instanceof EE_Base_Class |
|
| 503 | + ? array($this->_model_relations[$relationName]) : array(); |
|
| 504 | + } |
|
| 505 | + // first check for a cache_id which is normally empty |
|
| 506 | + if ( ! empty($cache_id)) { |
|
| 507 | + // if the cache_id exists, then it means we are purposely trying to cache this with a known key that can then be used to retrieve the object later on |
|
| 508 | + $this->_model_relations[$relationName][$cache_id] = $object_to_cache; |
|
| 509 | + $return = $cache_id; |
|
| 510 | + } elseif ($object_to_cache->ID()) { |
|
| 511 | + // OR the cached object originally came from the db, so let's just use it's PK for an ID |
|
| 512 | + $this->_model_relations[$relationName][$object_to_cache->ID()] = $object_to_cache; |
|
| 513 | + $return = $object_to_cache->ID(); |
|
| 514 | + } else { |
|
| 515 | + // OR it's a new object with no ID, so just throw it in the array with an auto-incremented ID |
|
| 516 | + $this->_model_relations[$relationName][] = $object_to_cache; |
|
| 517 | + // move the internal pointer to the end of the array |
|
| 518 | + end($this->_model_relations[$relationName]); |
|
| 519 | + // and grab the key so that we can return it |
|
| 520 | + $return = key($this->_model_relations[$relationName]); |
|
| 521 | + } |
|
| 522 | + } |
|
| 523 | + return $return; |
|
| 524 | + } |
|
| 525 | + |
|
| 526 | + |
|
| 527 | + |
|
| 528 | + /** |
|
| 529 | + * For adding an item to the cached_properties property. |
|
| 530 | + * |
|
| 531 | + * @access protected |
|
| 532 | + * @param string $fieldname the property item the corresponding value is for. |
|
| 533 | + * @param mixed $value The value we are caching. |
|
| 534 | + * @param string|null $cache_type |
|
| 535 | + * @return void |
|
| 536 | + * @throws \EE_Error |
|
| 537 | + */ |
|
| 538 | + protected function _set_cached_property($fieldname, $value, $cache_type = null) |
|
| 539 | + { |
|
| 540 | + //first make sure this property exists |
|
| 541 | + $this->get_model()->field_settings_for($fieldname); |
|
| 542 | + $cache_type = empty($cache_type) ? 'standard' : $cache_type; |
|
| 543 | + $this->_cached_properties[$fieldname][$cache_type] = $value; |
|
| 544 | + } |
|
| 545 | + |
|
| 546 | + |
|
| 547 | + |
|
| 548 | + /** |
|
| 549 | + * This returns the value cached property if it exists OR the actual property value if the cache doesn't exist. |
|
| 550 | + * This also SETS the cache if we return the actual property! |
|
| 551 | + * |
|
| 552 | + * @param string $fieldname the name of the property we're trying to retrieve |
|
| 553 | + * @param bool $pretty |
|
| 554 | + * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 555 | + * (in cases where the same property may be used for different outputs |
|
| 556 | + * - i.e. datetime, money etc.) |
|
| 557 | + * It can also accept certain pre-defined "schema" strings |
|
| 558 | + * to define how to output the property. |
|
| 559 | + * see the field's prepare_for_pretty_echoing for what strings can be used |
|
| 560 | + * @return mixed whatever the value for the property is we're retrieving |
|
| 561 | + * @throws \EE_Error |
|
| 562 | + */ |
|
| 563 | + protected function _get_cached_property($fieldname, $pretty = false, $extra_cache_ref = null) |
|
| 564 | + { |
|
| 565 | + //verify the field exists |
|
| 566 | + $this->get_model()->field_settings_for($fieldname); |
|
| 567 | + $cache_type = $pretty ? 'pretty' : 'standard'; |
|
| 568 | + $cache_type .= ! empty($extra_cache_ref) ? '_' . $extra_cache_ref : ''; |
|
| 569 | + if (isset($this->_cached_properties[$fieldname][$cache_type])) { |
|
| 570 | + return $this->_cached_properties[$fieldname][$cache_type]; |
|
| 571 | + } |
|
| 572 | + $field_obj = $this->get_model()->field_settings_for($fieldname); |
|
| 573 | + if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 574 | + // If this is an EE_Datetime_Field we need to make sure timezone, formats, and output are correct |
|
| 575 | + if ($field_obj instanceof EE_Datetime_Field) { |
|
| 576 | + $this->_prepare_datetime_field($field_obj, $pretty, $extra_cache_ref); |
|
| 577 | + } |
|
| 578 | + if ( ! isset($this->_fields[$fieldname])) { |
|
| 579 | + $this->_fields[$fieldname] = null; |
|
| 580 | + } |
|
| 581 | + $value = $pretty |
|
| 582 | + ? $field_obj->prepare_for_pretty_echoing($this->_fields[$fieldname], $extra_cache_ref) |
|
| 583 | + : $field_obj->prepare_for_get($this->_fields[$fieldname]); |
|
| 584 | + $this->_set_cached_property($fieldname, $value, $cache_type); |
|
| 585 | + return $value; |
|
| 586 | + } |
|
| 587 | + return null; |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + |
|
| 591 | + |
|
| 592 | + /** |
|
| 593 | + * set timezone, formats, and output for EE_Datetime_Field objects |
|
| 594 | + * |
|
| 595 | + * @param \EE_Datetime_Field $datetime_field |
|
| 596 | + * @param bool $pretty |
|
| 597 | + * @param null $date_or_time |
|
| 598 | + * @return void |
|
| 599 | + * @throws \EE_Error |
|
| 600 | + */ |
|
| 601 | + protected function _prepare_datetime_field( |
|
| 602 | + EE_Datetime_Field $datetime_field, |
|
| 603 | + $pretty = false, |
|
| 604 | + $date_or_time = null |
|
| 605 | + ) { |
|
| 606 | + $datetime_field->set_timezone($this->_timezone); |
|
| 607 | + $datetime_field->set_date_format($this->_dt_frmt, $pretty); |
|
| 608 | + $datetime_field->set_time_format($this->_tm_frmt, $pretty); |
|
| 609 | + //set the output returned |
|
| 610 | + switch ($date_or_time) { |
|
| 611 | + case 'D' : |
|
| 612 | + $datetime_field->set_date_time_output('date'); |
|
| 613 | + break; |
|
| 614 | + case 'T' : |
|
| 615 | + $datetime_field->set_date_time_output('time'); |
|
| 616 | + break; |
|
| 617 | + default : |
|
| 618 | + $datetime_field->set_date_time_output(); |
|
| 619 | + } |
|
| 620 | + } |
|
| 621 | + |
|
| 622 | + |
|
| 623 | + |
|
| 624 | + /** |
|
| 625 | + * This just takes care of clearing out the cached_properties |
|
| 626 | + * |
|
| 627 | + * @return void |
|
| 628 | + */ |
|
| 629 | + protected function _clear_cached_properties() |
|
| 630 | + { |
|
| 631 | + $this->_cached_properties = array(); |
|
| 632 | + } |
|
| 633 | + |
|
| 634 | + |
|
| 635 | + |
|
| 636 | + /** |
|
| 637 | + * This just clears out ONE property if it exists in the cache |
|
| 638 | + * |
|
| 639 | + * @param string $property_name the property to remove if it exists (from the _cached_properties array) |
|
| 640 | + * @return void |
|
| 641 | + */ |
|
| 642 | + protected function _clear_cached_property($property_name) |
|
| 643 | + { |
|
| 644 | + if (isset($this->_cached_properties[$property_name])) { |
|
| 645 | + unset($this->_cached_properties[$property_name]); |
|
| 646 | + } |
|
| 647 | + } |
|
| 648 | + |
|
| 649 | + |
|
| 650 | + |
|
| 651 | + /** |
|
| 652 | + * Ensures that this related thing is a model object. |
|
| 653 | + * |
|
| 654 | + * @param mixed $object_or_id EE_base_Class/int/string either a related model object, or its ID |
|
| 655 | + * @param string $model_name name of the related thing, eg 'Attendee', |
|
| 656 | + * @return EE_Base_Class |
|
| 657 | + * @throws \EE_Error |
|
| 658 | + */ |
|
| 659 | + protected function ensure_related_thing_is_model_obj($object_or_id, $model_name) |
|
| 660 | + { |
|
| 661 | + $other_model_instance = self::_get_model_instance_with_name( |
|
| 662 | + self::_get_model_classname($model_name), |
|
| 663 | + $this->_timezone |
|
| 664 | + ); |
|
| 665 | + return $other_model_instance->ensure_is_obj($object_or_id); |
|
| 666 | + } |
|
| 667 | + |
|
| 668 | + |
|
| 669 | + |
|
| 670 | + /** |
|
| 671 | + * Forgets the cached model of the given relation Name. So the next time we request it, |
|
| 672 | + * we will fetch it again from the database. (Handy if you know it's changed somehow). |
|
| 673 | + * If a specific object is supplied, and the relationship to it is either a HasMany or HABTM, |
|
| 674 | + * then only remove that one object from our cached array. Otherwise, clear the entire list |
|
| 675 | + * |
|
| 676 | + * @param string $relationName one of the keys in the _model_relations array on the model. |
|
| 677 | + * Eg 'Registration' |
|
| 678 | + * @param mixed $object_to_remove_or_index_into_array or an index into the array of cached things, or NULL |
|
| 679 | + * if you intend to use $clear_all = TRUE, or the relation only |
|
| 680 | + * has 1 object anyways (ie, it's a BelongsToRelation) |
|
| 681 | + * @param bool $clear_all This flags clearing the entire cache relation property if |
|
| 682 | + * this is HasMany or HABTM. |
|
| 683 | + * @throws EE_Error |
|
| 684 | + * @return EE_Base_Class | boolean from which was cleared from the cache, or true if we requested to remove a |
|
| 685 | + * relation from all |
|
| 686 | + */ |
|
| 687 | + public function clear_cache($relationName, $object_to_remove_or_index_into_array = null, $clear_all = false) |
|
| 688 | + { |
|
| 689 | + $relationship_to_model = $this->get_model()->related_settings_for($relationName); |
|
| 690 | + $index_in_cache = ''; |
|
| 691 | + if ( ! $relationship_to_model) { |
|
| 692 | + throw new EE_Error( |
|
| 693 | + sprintf( |
|
| 694 | + __("There is no relationship to %s on a %s. Cannot clear that cache", 'event_espresso'), |
|
| 695 | + $relationName, |
|
| 696 | + get_class($this) |
|
| 697 | + ) |
|
| 698 | + ); |
|
| 699 | + } |
|
| 700 | + if ($clear_all) { |
|
| 701 | + $obj_removed = true; |
|
| 702 | + $this->_model_relations[$relationName] = null; |
|
| 703 | + } elseif ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 704 | + $obj_removed = $this->_model_relations[$relationName]; |
|
| 705 | + $this->_model_relations[$relationName] = null; |
|
| 706 | + } else { |
|
| 707 | + if ($object_to_remove_or_index_into_array instanceof EE_Base_Class |
|
| 708 | + && $object_to_remove_or_index_into_array->ID() |
|
| 709 | + ) { |
|
| 710 | + $index_in_cache = $object_to_remove_or_index_into_array->ID(); |
|
| 711 | + if (is_array($this->_model_relations[$relationName]) |
|
| 712 | + && ! isset($this->_model_relations[$relationName][$index_in_cache]) |
|
| 713 | + ) { |
|
| 714 | + $index_found_at = null; |
|
| 715 | + //find this object in the array even though it has a different key |
|
| 716 | + foreach ($this->_model_relations[$relationName] as $index => $obj) { |
|
| 717 | + if ( |
|
| 718 | + $obj instanceof EE_Base_Class |
|
| 719 | + && ( |
|
| 720 | + $obj == $object_to_remove_or_index_into_array |
|
| 721 | + || $obj->ID() === $object_to_remove_or_index_into_array->ID() |
|
| 722 | + ) |
|
| 723 | + ) { |
|
| 724 | + $index_found_at = $index; |
|
| 725 | + break; |
|
| 726 | + } |
|
| 727 | + } |
|
| 728 | + if ($index_found_at) { |
|
| 729 | + $index_in_cache = $index_found_at; |
|
| 730 | + } else { |
|
| 731 | + //it wasn't found. huh. well obviously it doesn't need to be removed from teh cache |
|
| 732 | + //if it wasn't in it to begin with. So we're done |
|
| 733 | + return $object_to_remove_or_index_into_array; |
|
| 734 | + } |
|
| 735 | + } |
|
| 736 | + } elseif ($object_to_remove_or_index_into_array instanceof EE_Base_Class) { |
|
| 737 | + //so they provided a model object, but it's not yet saved to the DB... so let's go hunting for it! |
|
| 738 | + foreach ($this->get_all_from_cache($relationName) as $index => $potentially_obj_we_want) { |
|
| 739 | + if ($potentially_obj_we_want == $object_to_remove_or_index_into_array) { |
|
| 740 | + $index_in_cache = $index; |
|
| 741 | + } |
|
| 742 | + } |
|
| 743 | + } else { |
|
| 744 | + $index_in_cache = $object_to_remove_or_index_into_array; |
|
| 745 | + } |
|
| 746 | + //supposedly we've found it. But it could just be that the client code |
|
| 747 | + //provided a bad index/object |
|
| 748 | + if ( |
|
| 749 | + isset( |
|
| 750 | + $this->_model_relations[$relationName], |
|
| 751 | + $this->_model_relations[$relationName][$index_in_cache] |
|
| 752 | + ) |
|
| 753 | + ) { |
|
| 754 | + $obj_removed = $this->_model_relations[$relationName][$index_in_cache]; |
|
| 755 | + unset($this->_model_relations[$relationName][$index_in_cache]); |
|
| 756 | + } else { |
|
| 757 | + //that thing was never cached anyways. |
|
| 758 | + $obj_removed = null; |
|
| 759 | + } |
|
| 760 | + } |
|
| 761 | + return $obj_removed; |
|
| 762 | + } |
|
| 763 | + |
|
| 764 | + |
|
| 765 | + |
|
| 766 | + /** |
|
| 767 | + * update_cache_after_object_save |
|
| 768 | + * Allows a cached item to have it's cache ID (within the array of cached items) reset using the new ID it has |
|
| 769 | + * obtained after being saved to the db |
|
| 770 | + * |
|
| 771 | + * @param string $relationName - the type of object that is cached |
|
| 772 | + * @param \EE_Base_Class $newly_saved_object - the newly saved object to be re-cached |
|
| 773 | + * @param string $current_cache_id - the ID that was used when originally caching the object |
|
| 774 | + * @return boolean TRUE on success, FALSE on fail |
|
| 775 | + * @throws \EE_Error |
|
| 776 | + */ |
|
| 777 | + public function update_cache_after_object_save( |
|
| 778 | + $relationName, |
|
| 779 | + EE_Base_Class $newly_saved_object, |
|
| 780 | + $current_cache_id = '' |
|
| 781 | + ) { |
|
| 782 | + // verify that incoming object is of the correct type |
|
| 783 | + $obj_class = 'EE_' . $relationName; |
|
| 784 | + if ($newly_saved_object instanceof $obj_class) { |
|
| 785 | + /* @type EE_Base_Class $newly_saved_object */ |
|
| 786 | + // now get the type of relation |
|
| 787 | + $relationship_to_model = $this->get_model()->related_settings_for($relationName); |
|
| 788 | + // if this is a 1:1 relationship |
|
| 789 | + if ($relationship_to_model instanceof EE_Belongs_To_Relation) { |
|
| 790 | + // then just replace the cached object with the newly saved object |
|
| 791 | + $this->_model_relations[$relationName] = $newly_saved_object; |
|
| 792 | + return true; |
|
| 793 | + // or if it's some kind of sordid feral polyamorous relationship... |
|
| 794 | + } elseif (is_array($this->_model_relations[$relationName]) |
|
| 795 | + && isset($this->_model_relations[$relationName][$current_cache_id]) |
|
| 796 | + ) { |
|
| 797 | + // then remove the current cached item |
|
| 798 | + unset($this->_model_relations[$relationName][$current_cache_id]); |
|
| 799 | + // and cache the newly saved object using it's new ID |
|
| 800 | + $this->_model_relations[$relationName][$newly_saved_object->ID()] = $newly_saved_object; |
|
| 801 | + return true; |
|
| 802 | + } |
|
| 803 | + } |
|
| 804 | + return false; |
|
| 805 | + } |
|
| 806 | + |
|
| 807 | + |
|
| 808 | + |
|
| 809 | + /** |
|
| 810 | + * Fetches a single EE_Base_Class on that relation. (If the relation is of type |
|
| 811 | + * BelongsTo, it will only ever have 1 object. However, other relations could have an array of objects) |
|
| 812 | + * |
|
| 813 | + * @param string $relationName |
|
| 814 | + * @return EE_Base_Class |
|
| 815 | + */ |
|
| 816 | + public function get_one_from_cache($relationName) |
|
| 817 | + { |
|
| 818 | + $cached_array_or_object = isset($this->_model_relations[$relationName]) ? $this->_model_relations[$relationName] |
|
| 819 | + : null; |
|
| 820 | + if (is_array($cached_array_or_object)) { |
|
| 821 | + return array_shift($cached_array_or_object); |
|
| 822 | + } else { |
|
| 823 | + return $cached_array_or_object; |
|
| 824 | + } |
|
| 825 | + } |
|
| 826 | + |
|
| 827 | + |
|
| 828 | + |
|
| 829 | + /** |
|
| 830 | + * Fetches a single EE_Base_Class on that relation. (If the relation is of type |
|
| 831 | + * BelongsTo, it will only ever have 1 object. However, other relations could have an array of objects) |
|
| 832 | + * |
|
| 833 | + * @param string $relationName |
|
| 834 | + * @throws \EE_Error |
|
| 835 | + * @return EE_Base_Class[] NOT necessarily indexed by primary keys |
|
| 836 | + */ |
|
| 837 | + public function get_all_from_cache($relationName) |
|
| 838 | + { |
|
| 839 | + $objects = isset($this->_model_relations[$relationName]) ? $this->_model_relations[$relationName] : array(); |
|
| 840 | + // if the result is not an array, but exists, make it an array |
|
| 841 | + $objects = is_array($objects) ? $objects : array($objects); |
|
| 842 | + //bugfix for https://events.codebasehq.com/projects/event-espresso/tickets/7143 |
|
| 843 | + //basically, if this model object was stored in the session, and these cached model objects |
|
| 844 | + //already have IDs, let's make sure they're in their model's entity mapper |
|
| 845 | + //otherwise we will have duplicates next time we call |
|
| 846 | + // EE_Registry::instance()->load_model( $relationName )->get_one_by_ID( $result->ID() ); |
|
| 847 | + $model = EE_Registry::instance()->load_model($relationName); |
|
| 848 | + foreach ($objects as $model_object) { |
|
| 849 | + if ($model instanceof EEM_Base && $model_object instanceof EE_Base_Class) { |
|
| 850 | + //ensure its in the map if it has an ID; otherwise it will be added to the map when its saved |
|
| 851 | + if ($model_object->ID()) { |
|
| 852 | + $model->add_to_entity_map($model_object); |
|
| 853 | + } |
|
| 854 | + } else { |
|
| 855 | + throw new EE_Error( |
|
| 856 | + sprintf( |
|
| 857 | + __( |
|
| 858 | + 'Error retrieving related model objects. Either $1%s is not a model or $2%s is not a model object', |
|
| 859 | + 'event_espresso' |
|
| 860 | + ), |
|
| 861 | + $relationName, |
|
| 862 | + gettype($model_object) |
|
| 863 | + ) |
|
| 864 | + ); |
|
| 865 | + } |
|
| 866 | + } |
|
| 867 | + return $objects; |
|
| 868 | + } |
|
| 869 | + |
|
| 870 | + |
|
| 871 | + |
|
| 872 | + /** |
|
| 873 | + * Returns the next x number of EE_Base_Class objects in sequence from this object as found in the database |
|
| 874 | + * matching the given query conditions. |
|
| 875 | + * |
|
| 876 | + * @param null $field_to_order_by What field is being used as the reference point. |
|
| 877 | + * @param int $limit How many objects to return. |
|
| 878 | + * @param array $query_params Any additional conditions on the query. |
|
| 879 | + * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 880 | + * you can indicate just the columns you want returned |
|
| 881 | + * @return array|EE_Base_Class[] |
|
| 882 | + * @throws \EE_Error |
|
| 883 | + */ |
|
| 884 | + public function next_x($field_to_order_by = null, $limit = 1, $query_params = array(), $columns_to_select = null) |
|
| 885 | + { |
|
| 886 | + $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 887 | + ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 888 | + : $field_to_order_by; |
|
| 889 | + $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 890 | + if (empty($field) || empty($current_value)) { |
|
| 891 | + return array(); |
|
| 892 | + } |
|
| 893 | + return $this->get_model()->next_x($current_value, $field, $limit, $query_params, $columns_to_select); |
|
| 894 | + } |
|
| 895 | + |
|
| 896 | + |
|
| 897 | + |
|
| 898 | + /** |
|
| 899 | + * Returns the previous x number of EE_Base_Class objects in sequence from this object as found in the database |
|
| 900 | + * matching the given query conditions. |
|
| 901 | + * |
|
| 902 | + * @param null $field_to_order_by What field is being used as the reference point. |
|
| 903 | + * @param int $limit How many objects to return. |
|
| 904 | + * @param array $query_params Any additional conditions on the query. |
|
| 905 | + * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 906 | + * you can indicate just the columns you want returned |
|
| 907 | + * @return array|EE_Base_Class[] |
|
| 908 | + * @throws \EE_Error |
|
| 909 | + */ |
|
| 910 | + public function previous_x( |
|
| 911 | + $field_to_order_by = null, |
|
| 912 | + $limit = 1, |
|
| 913 | + $query_params = array(), |
|
| 914 | + $columns_to_select = null |
|
| 915 | + ) { |
|
| 916 | + $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 917 | + ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 918 | + : $field_to_order_by; |
|
| 919 | + $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 920 | + if (empty($field) || empty($current_value)) { |
|
| 921 | + return array(); |
|
| 922 | + } |
|
| 923 | + return $this->get_model()->previous_x($current_value, $field, $limit, $query_params, $columns_to_select); |
|
| 924 | + } |
|
| 925 | + |
|
| 926 | + |
|
| 927 | + |
|
| 928 | + /** |
|
| 929 | + * Returns the next EE_Base_Class object in sequence from this object as found in the database |
|
| 930 | + * matching the given query conditions. |
|
| 931 | + * |
|
| 932 | + * @param null $field_to_order_by What field is being used as the reference point. |
|
| 933 | + * @param array $query_params Any additional conditions on the query. |
|
| 934 | + * @param null $columns_to_select If left null, then an array of EE_Base_Class objects is returned, otherwise |
|
| 935 | + * you can indicate just the columns you want returned |
|
| 936 | + * @return array|EE_Base_Class |
|
| 937 | + * @throws \EE_Error |
|
| 938 | + */ |
|
| 939 | + public function next($field_to_order_by = null, $query_params = array(), $columns_to_select = null) |
|
| 940 | + { |
|
| 941 | + $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 942 | + ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 943 | + : $field_to_order_by; |
|
| 944 | + $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 945 | + if (empty($field) || empty($current_value)) { |
|
| 946 | + return array(); |
|
| 947 | + } |
|
| 948 | + return $this->get_model()->next($current_value, $field, $query_params, $columns_to_select); |
|
| 949 | + } |
|
| 950 | + |
|
| 951 | + |
|
| 952 | + |
|
| 953 | + /** |
|
| 954 | + * Returns the previous EE_Base_Class object in sequence from this object as found in the database |
|
| 955 | + * matching the given query conditions. |
|
| 956 | + * |
|
| 957 | + * @param null $field_to_order_by What field is being used as the reference point. |
|
| 958 | + * @param array $query_params Any additional conditions on the query. |
|
| 959 | + * @param null $columns_to_select If left null, then an EE_Base_Class object is returned, otherwise |
|
| 960 | + * you can indicate just the column you want returned |
|
| 961 | + * @return array|EE_Base_Class |
|
| 962 | + * @throws \EE_Error |
|
| 963 | + */ |
|
| 964 | + public function previous($field_to_order_by = null, $query_params = array(), $columns_to_select = null) |
|
| 965 | + { |
|
| 966 | + $field = empty($field_to_order_by) && $this->get_model()->has_primary_key_field() |
|
| 967 | + ? $this->get_model()->get_primary_key_field()->get_name() |
|
| 968 | + : $field_to_order_by; |
|
| 969 | + $current_value = ! empty($field) ? $this->get($field) : null; |
|
| 970 | + if (empty($field) || empty($current_value)) { |
|
| 971 | + return array(); |
|
| 972 | + } |
|
| 973 | + return $this->get_model()->previous($current_value, $field, $query_params, $columns_to_select); |
|
| 974 | + } |
|
| 975 | + |
|
| 976 | + |
|
| 977 | + |
|
| 978 | + /** |
|
| 979 | + * Overrides parent because parent expects old models. |
|
| 980 | + * This also doesn't do any validation, and won't work for serialized arrays |
|
| 981 | + * |
|
| 982 | + * @param string $field_name |
|
| 983 | + * @param mixed $field_value_from_db |
|
| 984 | + * @throws \EE_Error |
|
| 985 | + */ |
|
| 986 | + public function set_from_db($field_name, $field_value_from_db) |
|
| 987 | + { |
|
| 988 | + $field_obj = $this->get_model()->field_settings_for($field_name); |
|
| 989 | + if ($field_obj instanceof EE_Model_Field_Base) { |
|
| 990 | + //you would think the DB has no NULLs for non-null label fields right? wrong! |
|
| 991 | + //eg, a CPT model object could have an entry in the posts table, but no |
|
| 992 | + //entry in the meta table. Meaning that all its columns in the meta table |
|
| 993 | + //are null! yikes! so when we find one like that, use defaults for its meta columns |
|
| 994 | + if ($field_value_from_db === null) { |
|
| 995 | + if ($field_obj->is_nullable()) { |
|
| 996 | + //if the field allows nulls, then let it be null |
|
| 997 | + $field_value = null; |
|
| 998 | + } else { |
|
| 999 | + $field_value = $field_obj->get_default_value(); |
|
| 1000 | + } |
|
| 1001 | + } else { |
|
| 1002 | + $field_value = $field_obj->prepare_for_set_from_db($field_value_from_db); |
|
| 1003 | + } |
|
| 1004 | + $this->_fields[$field_name] = $field_value; |
|
| 1005 | + $this->_clear_cached_property($field_name); |
|
| 1006 | + } |
|
| 1007 | + } |
|
| 1008 | + |
|
| 1009 | + |
|
| 1010 | + |
|
| 1011 | + /** |
|
| 1012 | + * verifies that the specified field is of the correct type |
|
| 1013 | + * |
|
| 1014 | + * @param string $field_name |
|
| 1015 | + * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1016 | + * (in cases where the same property may be used for different outputs |
|
| 1017 | + * - i.e. datetime, money etc.) |
|
| 1018 | + * @return mixed |
|
| 1019 | + * @throws \EE_Error |
|
| 1020 | + */ |
|
| 1021 | + public function get($field_name, $extra_cache_ref = null) |
|
| 1022 | + { |
|
| 1023 | + return $this->_get_cached_property($field_name, false, $extra_cache_ref); |
|
| 1024 | + } |
|
| 1025 | + |
|
| 1026 | + |
|
| 1027 | + |
|
| 1028 | + /** |
|
| 1029 | + * This method simply returns the RAW unprocessed value for the given property in this class |
|
| 1030 | + * |
|
| 1031 | + * @param string $field_name A valid fieldname |
|
| 1032 | + * @return mixed Whatever the raw value stored on the property is. |
|
| 1033 | + * @throws EE_Error if fieldSettings is misconfigured or the field doesn't exist. |
|
| 1034 | + */ |
|
| 1035 | + public function get_raw($field_name) |
|
| 1036 | + { |
|
| 1037 | + $field_settings = $this->get_model()->field_settings_for($field_name); |
|
| 1038 | + return $field_settings instanceof EE_Datetime_Field && $this->_fields[$field_name] instanceof DateTime |
|
| 1039 | + ? $this->_fields[$field_name]->format('U') |
|
| 1040 | + : $this->_fields[$field_name]; |
|
| 1041 | + } |
|
| 1042 | + |
|
| 1043 | + |
|
| 1044 | + |
|
| 1045 | + /** |
|
| 1046 | + * This is used to return the internal DateTime object used for a field that is a |
|
| 1047 | + * EE_Datetime_Field. |
|
| 1048 | + * |
|
| 1049 | + * @param string $field_name The field name retrieving the DateTime object. |
|
| 1050 | + * @return mixed null | false | DateTime If the requested field is NOT a EE_Datetime_Field then |
|
| 1051 | + * @throws \EE_Error |
|
| 1052 | + * an error is set and false returned. If the field IS an |
|
| 1053 | + * EE_Datetime_Field and but the field value is null, then |
|
| 1054 | + * just null is returned (because that indicates that likely |
|
| 1055 | + * this field is nullable). |
|
| 1056 | + */ |
|
| 1057 | + public function get_DateTime_object($field_name) |
|
| 1058 | + { |
|
| 1059 | + $field_settings = $this->get_model()->field_settings_for($field_name); |
|
| 1060 | + if ( ! $field_settings instanceof EE_Datetime_Field) { |
|
| 1061 | + EE_Error::add_error( |
|
| 1062 | + sprintf( |
|
| 1063 | + __( |
|
| 1064 | + 'The field %s is not an EE_Datetime_Field field. There is no DateTime object stored on this field type.', |
|
| 1065 | + 'event_espresso' |
|
| 1066 | + ), |
|
| 1067 | + $field_name |
|
| 1068 | + ), |
|
| 1069 | + __FILE__, |
|
| 1070 | + __FUNCTION__, |
|
| 1071 | + __LINE__ |
|
| 1072 | + ); |
|
| 1073 | + return false; |
|
| 1074 | + } |
|
| 1075 | + return $this->_fields[$field_name]; |
|
| 1076 | + } |
|
| 1077 | + |
|
| 1078 | + |
|
| 1079 | + |
|
| 1080 | + /** |
|
| 1081 | + * To be used in template to immediately echo out the value, and format it for output. |
|
| 1082 | + * Eg, should call stripslashes and whatnot before echoing |
|
| 1083 | + * |
|
| 1084 | + * @param string $field_name the name of the field as it appears in the DB |
|
| 1085 | + * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1086 | + * (in cases where the same property may be used for different outputs |
|
| 1087 | + * - i.e. datetime, money etc.) |
|
| 1088 | + * @return void |
|
| 1089 | + * @throws \EE_Error |
|
| 1090 | + */ |
|
| 1091 | + public function e($field_name, $extra_cache_ref = null) |
|
| 1092 | + { |
|
| 1093 | + echo $this->get_pretty($field_name, $extra_cache_ref); |
|
| 1094 | + } |
|
| 1095 | + |
|
| 1096 | + |
|
| 1097 | + |
|
| 1098 | + /** |
|
| 1099 | + * Exactly like e(), echoes out the field, but sets its schema to 'form_input', so that it |
|
| 1100 | + * can be easily used as the value of form input. |
|
| 1101 | + * |
|
| 1102 | + * @param string $field_name |
|
| 1103 | + * @return void |
|
| 1104 | + * @throws \EE_Error |
|
| 1105 | + */ |
|
| 1106 | + public function f($field_name) |
|
| 1107 | + { |
|
| 1108 | + $this->e($field_name, 'form_input'); |
|
| 1109 | + } |
|
| 1110 | + |
|
| 1111 | + |
|
| 1112 | + |
|
| 1113 | + /** |
|
| 1114 | + * Gets a pretty view of the field's value. $extra_cache_ref can specify different formats for this. |
|
| 1115 | + * The $extra_cache_ref will be passed to the model field's prepare_for_pretty_echoing, so consult the field's class |
|
| 1116 | + * to see what options are available. |
|
| 1117 | + * @param string $field_name |
|
| 1118 | + * @param string $extra_cache_ref This allows the user to specify an extra cache ref for the given property |
|
| 1119 | + * (in cases where the same property may be used for different outputs |
|
| 1120 | + * - i.e. datetime, money etc.) |
|
| 1121 | + * @return mixed |
|
| 1122 | + * @throws \EE_Error |
|
| 1123 | + */ |
|
| 1124 | + public function get_pretty($field_name, $extra_cache_ref = null) |
|
| 1125 | + { |
|
| 1126 | + return $this->_get_cached_property($field_name, true, $extra_cache_ref); |
|
| 1127 | + } |
|
| 1128 | + |
|
| 1129 | + |
|
| 1130 | + |
|
| 1131 | + /** |
|
| 1132 | + * This simply returns the datetime for the given field name |
|
| 1133 | + * Note: this protected function is called by the wrapper get_date or get_time or get_datetime functions |
|
| 1134 | + * (and the equivalent e_date, e_time, e_datetime). |
|
| 1135 | + * |
|
| 1136 | + * @access protected |
|
| 1137 | + * @param string $field_name Field on the instantiated EE_Base_Class child object |
|
| 1138 | + * @param string $dt_frmt valid datetime format used for date |
|
| 1139 | + * (if '' then we just use the default on the field, |
|
| 1140 | + * if NULL we use the last-used format) |
|
| 1141 | + * @param string $tm_frmt Same as above except this is for time format |
|
| 1142 | + * @param string $date_or_time if NULL then both are returned, otherwise "D" = only date and "T" = only time. |
|
| 1143 | + * @param boolean $echo Whether the dtt is echoing using pretty echoing or just returned using vanilla get |
|
| 1144 | + * @return string|bool|EE_Error string on success, FALSE on fail, or EE_Error Exception is thrown |
|
| 1145 | + * if field is not a valid dtt field, or void if echoing |
|
| 1146 | + * @throws \EE_Error |
|
| 1147 | + */ |
|
| 1148 | + protected function _get_datetime($field_name, $dt_frmt = '', $tm_frmt = '', $date_or_time = '', $echo = false) |
|
| 1149 | + { |
|
| 1150 | + // clear cached property |
|
| 1151 | + $this->_clear_cached_property($field_name); |
|
| 1152 | + //reset format properties because they are used in get() |
|
| 1153 | + $this->_dt_frmt = $dt_frmt !== '' ? $dt_frmt : $this->_dt_frmt; |
|
| 1154 | + $this->_tm_frmt = $tm_frmt !== '' ? $tm_frmt : $this->_tm_frmt; |
|
| 1155 | + if ($echo) { |
|
| 1156 | + $this->e($field_name, $date_or_time); |
|
| 1157 | + return ''; |
|
| 1158 | + } |
|
| 1159 | + return $this->get($field_name, $date_or_time); |
|
| 1160 | + } |
|
| 1161 | + |
|
| 1162 | + |
|
| 1163 | + |
|
| 1164 | + /** |
|
| 1165 | + * below are wrapper functions for the various datetime outputs that can be obtained for JUST returning the date |
|
| 1166 | + * portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1167 | + * other echoes the pretty value for dtt) |
|
| 1168 | + * |
|
| 1169 | + * @param string $field_name name of model object datetime field holding the value |
|
| 1170 | + * @param string $format format for the date returned (if NULL we use default in dt_frmt property) |
|
| 1171 | + * @return string datetime value formatted |
|
| 1172 | + * @throws \EE_Error |
|
| 1173 | + */ |
|
| 1174 | + public function get_date($field_name, $format = '') |
|
| 1175 | + { |
|
| 1176 | + return $this->_get_datetime($field_name, $format, null, 'D'); |
|
| 1177 | + } |
|
| 1178 | + |
|
| 1179 | + |
|
| 1180 | + |
|
| 1181 | + /** |
|
| 1182 | + * @param $field_name |
|
| 1183 | + * @param string $format |
|
| 1184 | + * @throws \EE_Error |
|
| 1185 | + */ |
|
| 1186 | + public function e_date($field_name, $format = '') |
|
| 1187 | + { |
|
| 1188 | + $this->_get_datetime($field_name, $format, null, 'D', true); |
|
| 1189 | + } |
|
| 1190 | + |
|
| 1191 | + |
|
| 1192 | + |
|
| 1193 | + /** |
|
| 1194 | + * below are wrapper functions for the various datetime outputs that can be obtained for JUST returning the time |
|
| 1195 | + * portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1196 | + * other echoes the pretty value for dtt) |
|
| 1197 | + * |
|
| 1198 | + * @param string $field_name name of model object datetime field holding the value |
|
| 1199 | + * @param string $format format for the time returned ( if NULL we use default in tm_frmt property) |
|
| 1200 | + * @return string datetime value formatted |
|
| 1201 | + * @throws \EE_Error |
|
| 1202 | + */ |
|
| 1203 | + public function get_time($field_name, $format = '') |
|
| 1204 | + { |
|
| 1205 | + return $this->_get_datetime($field_name, null, $format, 'T'); |
|
| 1206 | + } |
|
| 1207 | + |
|
| 1208 | + |
|
| 1209 | + |
|
| 1210 | + /** |
|
| 1211 | + * @param $field_name |
|
| 1212 | + * @param string $format |
|
| 1213 | + * @throws \EE_Error |
|
| 1214 | + */ |
|
| 1215 | + public function e_time($field_name, $format = '') |
|
| 1216 | + { |
|
| 1217 | + $this->_get_datetime($field_name, null, $format, 'T', true); |
|
| 1218 | + } |
|
| 1219 | + |
|
| 1220 | + |
|
| 1221 | + |
|
| 1222 | + /** |
|
| 1223 | + * below are wrapper functions for the various datetime outputs that can be obtained for returning the date AND |
|
| 1224 | + * time portion of a datetime value. (note the only difference between get_ and e_ is one returns the value and the |
|
| 1225 | + * other echoes the pretty value for dtt) |
|
| 1226 | + * |
|
| 1227 | + * @param string $field_name name of model object datetime field holding the value |
|
| 1228 | + * @param string $dt_frmt format for the date returned (if NULL we use default in dt_frmt property) |
|
| 1229 | + * @param string $tm_frmt format for the time returned (if NULL we use default in tm_frmt property) |
|
| 1230 | + * @return string datetime value formatted |
|
| 1231 | + * @throws \EE_Error |
|
| 1232 | + */ |
|
| 1233 | + public function get_datetime($field_name, $dt_frmt = '', $tm_frmt = '') |
|
| 1234 | + { |
|
| 1235 | + return $this->_get_datetime($field_name, $dt_frmt, $tm_frmt); |
|
| 1236 | + } |
|
| 1237 | + |
|
| 1238 | + |
|
| 1239 | + |
|
| 1240 | + /** |
|
| 1241 | + * @param string $field_name |
|
| 1242 | + * @param string $dt_frmt |
|
| 1243 | + * @param string $tm_frmt |
|
| 1244 | + * @throws \EE_Error |
|
| 1245 | + */ |
|
| 1246 | + public function e_datetime($field_name, $dt_frmt = '', $tm_frmt = '') |
|
| 1247 | + { |
|
| 1248 | + $this->_get_datetime($field_name, $dt_frmt, $tm_frmt, null, true); |
|
| 1249 | + } |
|
| 1250 | + |
|
| 1251 | + |
|
| 1252 | + |
|
| 1253 | + /** |
|
| 1254 | + * Get the i8ln value for a date using the WordPress @see date_i18n function. |
|
| 1255 | + * |
|
| 1256 | + * @param string $field_name The EE_Datetime_Field reference for the date being retrieved. |
|
| 1257 | + * @param string $format PHP valid date/time string format. If none is provided then the internal set format |
|
| 1258 | + * on the object will be used. |
|
| 1259 | + * @return string Date and time string in set locale or false if no field exists for the given |
|
| 1260 | + * @throws \EE_Error |
|
| 1261 | + * field name. |
|
| 1262 | + */ |
|
| 1263 | + public function get_i18n_datetime($field_name, $format = '') |
|
| 1264 | + { |
|
| 1265 | + $format = empty($format) ? $this->_dt_frmt . ' ' . $this->_tm_frmt : $format; |
|
| 1266 | + return date_i18n( |
|
| 1267 | + $format, |
|
| 1268 | + EEH_DTT_Helper::get_timestamp_with_offset($this->get_raw($field_name), $this->_timezone) |
|
| 1269 | + ); |
|
| 1270 | + } |
|
| 1271 | + |
|
| 1272 | + |
|
| 1273 | + |
|
| 1274 | + /** |
|
| 1275 | + * This method validates whether the given field name is a valid field on the model object as well as it is of a |
|
| 1276 | + * type EE_Datetime_Field. On success there will be returned the field settings. On fail an EE_Error exception is |
|
| 1277 | + * thrown. |
|
| 1278 | + * |
|
| 1279 | + * @param string $field_name The field name being checked |
|
| 1280 | + * @throws EE_Error |
|
| 1281 | + * @return EE_Datetime_Field |
|
| 1282 | + */ |
|
| 1283 | + protected function _get_dtt_field_settings($field_name) |
|
| 1284 | + { |
|
| 1285 | + $field = $this->get_model()->field_settings_for($field_name); |
|
| 1286 | + //check if field is dtt |
|
| 1287 | + if ($field instanceof EE_Datetime_Field) { |
|
| 1288 | + return $field; |
|
| 1289 | + } else { |
|
| 1290 | + throw new EE_Error(sprintf(__('The field name "%s" has been requested for the EE_Base_Class datetime functions and it is not a valid EE_Datetime_Field. Please check the spelling of the field and make sure it has been setup as a EE_Datetime_Field in the %s model constructor', |
|
| 1291 | + 'event_espresso'), $field_name, self::_get_model_classname(get_class($this)))); |
|
| 1292 | + } |
|
| 1293 | + } |
|
| 1294 | + |
|
| 1295 | + |
|
| 1296 | + |
|
| 1297 | + |
|
| 1298 | + /** |
|
| 1299 | + * NOTE ABOUT BELOW: |
|
| 1300 | + * These convenience date and time setters are for setting date and time independently. In other words you might |
|
| 1301 | + * want to change the time on a datetime_field but leave the date the same (or vice versa). IF on the other hand |
|
| 1302 | + * you want to set both date and time at the same time, you can just use the models default set($fieldname,$value) |
|
| 1303 | + * method and make sure you send the entire datetime value for setting. |
|
| 1304 | + */ |
|
| 1305 | + /** |
|
| 1306 | + * sets the time on a datetime property |
|
| 1307 | + * |
|
| 1308 | + * @access protected |
|
| 1309 | + * @param string|Datetime $time a valid time string for php datetime functions (or DateTime object) |
|
| 1310 | + * @param string $fieldname the name of the field the time is being set on (must match a EE_Datetime_Field) |
|
| 1311 | + * @throws \EE_Error |
|
| 1312 | + */ |
|
| 1313 | + protected function _set_time_for($time, $fieldname) |
|
| 1314 | + { |
|
| 1315 | + $this->_set_date_time('T', $time, $fieldname); |
|
| 1316 | + } |
|
| 1317 | + |
|
| 1318 | + |
|
| 1319 | + |
|
| 1320 | + /** |
|
| 1321 | + * sets the date on a datetime property |
|
| 1322 | + * |
|
| 1323 | + * @access protected |
|
| 1324 | + * @param string|DateTime $date a valid date string for php datetime functions ( or DateTime object) |
|
| 1325 | + * @param string $fieldname the name of the field the date is being set on (must match a EE_Datetime_Field) |
|
| 1326 | + * @throws \EE_Error |
|
| 1327 | + */ |
|
| 1328 | + protected function _set_date_for($date, $fieldname) |
|
| 1329 | + { |
|
| 1330 | + $this->_set_date_time('D', $date, $fieldname); |
|
| 1331 | + } |
|
| 1332 | + |
|
| 1333 | + |
|
| 1334 | + |
|
| 1335 | + /** |
|
| 1336 | + * This takes care of setting a date or time independently on a given model object property. This method also |
|
| 1337 | + * verifies that the given fieldname matches a model object property and is for a EE_Datetime_Field field |
|
| 1338 | + * |
|
| 1339 | + * @access protected |
|
| 1340 | + * @param string $what "T" for time, 'B' for both, 'D' for Date. |
|
| 1341 | + * @param string|DateTime $datetime_value A valid Date or Time string (or DateTime object) |
|
| 1342 | + * @param string $fieldname the name of the field the date OR time is being set on (must match a |
|
| 1343 | + * EE_Datetime_Field property) |
|
| 1344 | + * @throws \EE_Error |
|
| 1345 | + */ |
|
| 1346 | + protected function _set_date_time($what = 'T', $datetime_value, $fieldname) |
|
| 1347 | + { |
|
| 1348 | + $field = $this->_get_dtt_field_settings($fieldname); |
|
| 1349 | + $field->set_timezone($this->_timezone); |
|
| 1350 | + $field->set_date_format($this->_dt_frmt); |
|
| 1351 | + $field->set_time_format($this->_tm_frmt); |
|
| 1352 | + switch ($what) { |
|
| 1353 | + case 'T' : |
|
| 1354 | + $this->_fields[$fieldname] = $field->prepare_for_set_with_new_time( |
|
| 1355 | + $datetime_value, |
|
| 1356 | + $this->_fields[$fieldname] |
|
| 1357 | + ); |
|
| 1358 | + break; |
|
| 1359 | + case 'D' : |
|
| 1360 | + $this->_fields[$fieldname] = $field->prepare_for_set_with_new_date( |
|
| 1361 | + $datetime_value, |
|
| 1362 | + $this->_fields[$fieldname] |
|
| 1363 | + ); |
|
| 1364 | + break; |
|
| 1365 | + case 'B' : |
|
| 1366 | + $this->_fields[$fieldname] = $field->prepare_for_set($datetime_value); |
|
| 1367 | + break; |
|
| 1368 | + } |
|
| 1369 | + $this->_clear_cached_property($fieldname); |
|
| 1370 | + } |
|
| 1371 | + |
|
| 1372 | + |
|
| 1373 | + |
|
| 1374 | + /** |
|
| 1375 | + * This will return a timestamp for the website timezone but ONLY when the current website timezone is different |
|
| 1376 | + * than the timezone set for the website. NOTE, this currently only works well with methods that return values. If |
|
| 1377 | + * you use it with methods that echo values the $_timestamp property may not get reset to its original value and |
|
| 1378 | + * that could lead to some unexpected results! |
|
| 1379 | + * |
|
| 1380 | + * @access public |
|
| 1381 | + * @param string $field_name This is the name of the field on the object that contains the date/time |
|
| 1382 | + * value being returned. |
|
| 1383 | + * @param string $callback must match a valid method in this class (defaults to get_datetime) |
|
| 1384 | + * @param mixed (array|string) $args This is the arguments that will be passed to the callback. |
|
| 1385 | + * @param string $prepend You can include something to prepend on the timestamp |
|
| 1386 | + * @param string $append You can include something to append on the timestamp |
|
| 1387 | + * @throws EE_Error |
|
| 1388 | + * @return string timestamp |
|
| 1389 | + */ |
|
| 1390 | + public function display_in_my_timezone( |
|
| 1391 | + $field_name, |
|
| 1392 | + $callback = 'get_datetime', |
|
| 1393 | + $args = null, |
|
| 1394 | + $prepend = '', |
|
| 1395 | + $append = '' |
|
| 1396 | + ) { |
|
| 1397 | + $timezone = EEH_DTT_Helper::get_timezone(); |
|
| 1398 | + if ($timezone === $this->_timezone) { |
|
| 1399 | + return ''; |
|
| 1400 | + } |
|
| 1401 | + $original_timezone = $this->_timezone; |
|
| 1402 | + $this->set_timezone($timezone); |
|
| 1403 | + $fn = (array)$field_name; |
|
| 1404 | + $args = array_merge($fn, (array)$args); |
|
| 1405 | + if ( ! method_exists($this, $callback)) { |
|
| 1406 | + throw new EE_Error( |
|
| 1407 | + sprintf( |
|
| 1408 | + __( |
|
| 1409 | + 'The method named "%s" given as the callback param in "display_in_my_timezone" does not exist. Please check your spelling', |
|
| 1410 | + 'event_espresso' |
|
| 1411 | + ), |
|
| 1412 | + $callback |
|
| 1413 | + ) |
|
| 1414 | + ); |
|
| 1415 | + } |
|
| 1416 | + $args = (array)$args; |
|
| 1417 | + $return = $prepend . call_user_func_array(array($this, $callback), $args) . $append; |
|
| 1418 | + $this->set_timezone($original_timezone); |
|
| 1419 | + return $return; |
|
| 1420 | + } |
|
| 1421 | + |
|
| 1422 | + |
|
| 1423 | + |
|
| 1424 | + /** |
|
| 1425 | + * Deletes this model object. |
|
| 1426 | + * This calls the `EE_Base_Class::_delete` method. Child classes wishing to change default behaviour should |
|
| 1427 | + * override |
|
| 1428 | + * `EE_Base_Class::_delete` NOT this class. |
|
| 1429 | + * |
|
| 1430 | + * @return boolean | int |
|
| 1431 | + * @throws \EE_Error |
|
| 1432 | + */ |
|
| 1433 | + public function delete() |
|
| 1434 | + { |
|
| 1435 | + /** |
|
| 1436 | + * Called just before the `EE_Base_Class::_delete` method call. |
|
| 1437 | + * Note: `EE_Base_Class::_delete` might be overridden by child classes so any client code hooking into these actions |
|
| 1438 | + * should be aware that `_delete` may not always result in a permanent delete. For example, `EE_Soft_Delete_Base_Class::_delete` |
|
| 1439 | + * soft deletes (trash) the object and does not permanently delete it. |
|
| 1440 | + * |
|
| 1441 | + * @param EE_Base_Class $model_object about to be 'deleted' |
|
| 1442 | + */ |
|
| 1443 | + do_action('AHEE__EE_Base_Class__delete__before', $this); |
|
| 1444 | + $result = $this->_delete(); |
|
| 1445 | + /** |
|
| 1446 | + * Called just after the `EE_Base_Class::_delete` method call. |
|
| 1447 | + * Note: `EE_Base_Class::_delete` might be overridden by child classes so any client code hooking into these actions |
|
| 1448 | + * should be aware that `_delete` may not always result in a permanent delete. For example `EE_Soft_Base_Class::_delete` |
|
| 1449 | + * soft deletes (trash) the object and does not permanently delete it. |
|
| 1450 | + * |
|
| 1451 | + * @param EE_Base_Class $model_object that was just 'deleted' |
|
| 1452 | + * @param boolean $result |
|
| 1453 | + */ |
|
| 1454 | + do_action('AHEE__EE_Base_Class__delete__end', $this, $result); |
|
| 1455 | + return $result; |
|
| 1456 | + } |
|
| 1457 | + |
|
| 1458 | + |
|
| 1459 | + |
|
| 1460 | + /** |
|
| 1461 | + * Calls the specific delete method for the instantiated class. |
|
| 1462 | + * This method is called by the public `EE_Base_Class::delete` method. Any child classes desiring to override |
|
| 1463 | + * default functionality for "delete" (which is to call `permanently_delete`) should override this method NOT |
|
| 1464 | + * `EE_Base_Class::delete` |
|
| 1465 | + * |
|
| 1466 | + * @return bool|int |
|
| 1467 | + * @throws \EE_Error |
|
| 1468 | + */ |
|
| 1469 | + protected function _delete() |
|
| 1470 | + { |
|
| 1471 | + return $this->delete_permanently(); |
|
| 1472 | + } |
|
| 1473 | + |
|
| 1474 | + |
|
| 1475 | + |
|
| 1476 | + /** |
|
| 1477 | + * Deletes this model object permanently from db (but keep in mind related models my block the delete and return an |
|
| 1478 | + * error) |
|
| 1479 | + * |
|
| 1480 | + * @return bool | int |
|
| 1481 | + * @throws \EE_Error |
|
| 1482 | + */ |
|
| 1483 | + public function delete_permanently() |
|
| 1484 | + { |
|
| 1485 | + /** |
|
| 1486 | + * Called just before HARD deleting a model object |
|
| 1487 | + * |
|
| 1488 | + * @param EE_Base_Class $model_object about to be 'deleted' |
|
| 1489 | + */ |
|
| 1490 | + do_action('AHEE__EE_Base_Class__delete_permanently__before', $this); |
|
| 1491 | + $model = $this->get_model(); |
|
| 1492 | + $result = $model->delete_permanently_by_ID($this->ID()); |
|
| 1493 | + $this->refresh_cache_of_related_objects(); |
|
| 1494 | + /** |
|
| 1495 | + * Called just after HARD deleting a model object |
|
| 1496 | + * |
|
| 1497 | + * @param EE_Base_Class $model_object that was just 'deleted' |
|
| 1498 | + * @param boolean $result |
|
| 1499 | + */ |
|
| 1500 | + do_action('AHEE__EE_Base_Class__delete_permanently__end', $this, $result); |
|
| 1501 | + return $result; |
|
| 1502 | + } |
|
| 1503 | + |
|
| 1504 | + |
|
| 1505 | + |
|
| 1506 | + /** |
|
| 1507 | + * When this model object is deleted, it may still be cached on related model objects. This clears the cache of |
|
| 1508 | + * related model objects |
|
| 1509 | + * |
|
| 1510 | + * @throws \EE_Error |
|
| 1511 | + */ |
|
| 1512 | + public function refresh_cache_of_related_objects() |
|
| 1513 | + { |
|
| 1514 | + foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 1515 | + if ( ! empty($this->_model_relations[$relation_name])) { |
|
| 1516 | + $related_objects = $this->_model_relations[$relation_name]; |
|
| 1517 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 1518 | + //this relation only stores a single model object, not an array |
|
| 1519 | + //but let's make it consistent |
|
| 1520 | + $related_objects = array($related_objects); |
|
| 1521 | + } |
|
| 1522 | + foreach ($related_objects as $related_object) { |
|
| 1523 | + //only refresh their cache if they're in memory |
|
| 1524 | + if ($related_object instanceof EE_Base_Class) { |
|
| 1525 | + $related_object->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 1526 | + } |
|
| 1527 | + } |
|
| 1528 | + } |
|
| 1529 | + } |
|
| 1530 | + } |
|
| 1531 | + |
|
| 1532 | + |
|
| 1533 | + |
|
| 1534 | + /** |
|
| 1535 | + * Saves this object to the database. An array may be supplied to set some values on this |
|
| 1536 | + * object just before saving. |
|
| 1537 | + * |
|
| 1538 | + * @access public |
|
| 1539 | + * @param array $set_cols_n_values keys are field names, values are their new values, |
|
| 1540 | + * if provided during the save() method (often client code will change the fields' |
|
| 1541 | + * values before calling save) |
|
| 1542 | + * @throws \EE_Error |
|
| 1543 | + * @return int , 1 on a successful update, the ID of the new entry on insert; 0 on failure or if the model object |
|
| 1544 | + * isn't allowed to persist (as determined by EE_Base_Class::allow_persist()) |
|
| 1545 | + */ |
|
| 1546 | + public function save($set_cols_n_values = array()) |
|
| 1547 | + { |
|
| 1548 | + /** |
|
| 1549 | + * Filters the fields we're about to save on the model object |
|
| 1550 | + * |
|
| 1551 | + * @param array $set_cols_n_values |
|
| 1552 | + * @param EE_Base_Class $model_object |
|
| 1553 | + */ |
|
| 1554 | + $set_cols_n_values = (array)apply_filters('FHEE__EE_Base_Class__save__set_cols_n_values', $set_cols_n_values, |
|
| 1555 | + $this); |
|
| 1556 | + //set attributes as provided in $set_cols_n_values |
|
| 1557 | + foreach ($set_cols_n_values as $column => $value) { |
|
| 1558 | + $this->set($column, $value); |
|
| 1559 | + } |
|
| 1560 | + /** |
|
| 1561 | + * Saving a model object. |
|
| 1562 | + * Before we perform a save, this action is fired. |
|
| 1563 | + * |
|
| 1564 | + * @param EE_Base_Class $model_object the model object about to be saved. |
|
| 1565 | + */ |
|
| 1566 | + do_action('AHEE__EE_Base_Class__save__begin', $this); |
|
| 1567 | + if ( ! $this->allow_persist()) { |
|
| 1568 | + return 0; |
|
| 1569 | + } |
|
| 1570 | + //now get current attribute values |
|
| 1571 | + $save_cols_n_values = $this->_fields; |
|
| 1572 | + //if the object already has an ID, update it. Otherwise, insert it |
|
| 1573 | + //also: change the assumption about values passed to the model NOT being prepare dby the model object. They have been |
|
| 1574 | + $old_assumption_concerning_value_preparation = $this->get_model() |
|
| 1575 | + ->get_assumption_concerning_values_already_prepared_by_model_object(); |
|
| 1576 | + $this->get_model()->assume_values_already_prepared_by_model_object(true); |
|
| 1577 | + //does this model have an autoincrement PK? |
|
| 1578 | + if ($this->get_model()->has_primary_key_field()) { |
|
| 1579 | + if ($this->get_model()->get_primary_key_field()->is_auto_increment()) { |
|
| 1580 | + //ok check if it's set, if so: update; if not, insert |
|
| 1581 | + if ( ! empty($save_cols_n_values[self::_get_primary_key_name(get_class($this))])) { |
|
| 1582 | + $results = $this->get_model()->update_by_ID($save_cols_n_values, $this->ID()); |
|
| 1583 | + } else { |
|
| 1584 | + unset($save_cols_n_values[self::_get_primary_key_name(get_class($this))]); |
|
| 1585 | + $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1586 | + if ($results) { |
|
| 1587 | + //if successful, set the primary key |
|
| 1588 | + //but don't use the normal SET method, because it will check if |
|
| 1589 | + //an item with the same ID exists in the mapper & db, then |
|
| 1590 | + //will find it in the db (because we just added it) and THAT object |
|
| 1591 | + //will get added to the mapper before we can add this one! |
|
| 1592 | + //but if we just avoid using the SET method, all that headache can be avoided |
|
| 1593 | + $pk_field_name = self::_get_primary_key_name(get_class($this)); |
|
| 1594 | + $this->_fields[$pk_field_name] = $results; |
|
| 1595 | + $this->_clear_cached_property($pk_field_name); |
|
| 1596 | + $this->get_model()->add_to_entity_map($this); |
|
| 1597 | + $this->_update_cached_related_model_objs_fks(); |
|
| 1598 | + } |
|
| 1599 | + } |
|
| 1600 | + } else {//PK is NOT auto-increment |
|
| 1601 | + //so check if one like it already exists in the db |
|
| 1602 | + if ($this->get_model()->exists_by_ID($this->ID())) { |
|
| 1603 | + if (WP_DEBUG && ! $this->in_entity_map()) { |
|
| 1604 | + throw new EE_Error( |
|
| 1605 | + sprintf( |
|
| 1606 | + __('Using a model object %1$s that is NOT in the entity map, can lead to unexpected errors. You should either: %4$s 1. Put it in the entity mapper by calling %2$s %4$s 2. Discard this model object and use what is in the entity mapper %4$s 3. Fetch from the database using %3$s', |
|
| 1607 | + 'event_espresso'), |
|
| 1608 | + get_class($this), |
|
| 1609 | + get_class($this->get_model()) . '::instance()->add_to_entity_map()', |
|
| 1610 | + get_class($this->get_model()) . '::instance()->get_one_by_ID()', |
|
| 1611 | + '<br />' |
|
| 1612 | + ) |
|
| 1613 | + ); |
|
| 1614 | + } |
|
| 1615 | + $results = $this->get_model()->update_by_ID($save_cols_n_values, $this->ID()); |
|
| 1616 | + } else { |
|
| 1617 | + $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1618 | + $this->_update_cached_related_model_objs_fks(); |
|
| 1619 | + } |
|
| 1620 | + } |
|
| 1621 | + } else {//there is NO primary key |
|
| 1622 | + $already_in_db = false; |
|
| 1623 | + foreach ($this->get_model()->unique_indexes() as $index) { |
|
| 1624 | + $uniqueness_where_params = array_intersect_key($save_cols_n_values, $index->fields()); |
|
| 1625 | + if ($this->get_model()->exists(array($uniqueness_where_params))) { |
|
| 1626 | + $already_in_db = true; |
|
| 1627 | + } |
|
| 1628 | + } |
|
| 1629 | + if ($already_in_db) { |
|
| 1630 | + $combined_pk_fields_n_values = array_intersect_key($save_cols_n_values, |
|
| 1631 | + $this->get_model()->get_combined_primary_key_fields()); |
|
| 1632 | + $results = $this->get_model()->update($save_cols_n_values, $combined_pk_fields_n_values); |
|
| 1633 | + } else { |
|
| 1634 | + $results = $this->get_model()->insert($save_cols_n_values); |
|
| 1635 | + } |
|
| 1636 | + } |
|
| 1637 | + //restore the old assumption about values being prepared by the model object |
|
| 1638 | + $this->get_model() |
|
| 1639 | + ->assume_values_already_prepared_by_model_object($old_assumption_concerning_value_preparation); |
|
| 1640 | + /** |
|
| 1641 | + * After saving the model object this action is called |
|
| 1642 | + * |
|
| 1643 | + * @param EE_Base_Class $model_object which was just saved |
|
| 1644 | + * @param boolean|int $results if it were updated, TRUE or FALSE; if it were newly inserted |
|
| 1645 | + * the new ID (or 0 if an error occurred and it wasn't updated) |
|
| 1646 | + */ |
|
| 1647 | + do_action('AHEE__EE_Base_Class__save__end', $this, $results); |
|
| 1648 | + return $results; |
|
| 1649 | + } |
|
| 1650 | + |
|
| 1651 | + |
|
| 1652 | + |
|
| 1653 | + /** |
|
| 1654 | + * Updates the foreign key on related models objects pointing to this to have this model object's ID |
|
| 1655 | + * as their foreign key. If the cached related model objects already exist in the db, saves them (so that the DB |
|
| 1656 | + * is consistent) Especially useful in case we JUST added this model object ot the database and we want to let its |
|
| 1657 | + * cached relations with foreign keys to it know about that change. Eg: we've created a transaction but haven't |
|
| 1658 | + * saved it to the db. We also create a registration and don't save it to the DB, but we DO cache it on the |
|
| 1659 | + * transaction. Now, when we save the transaction, the registration's TXN_ID will be automatically updated, whether |
|
| 1660 | + * or not they exist in the DB (if they do, their DB records will be automatically updated) |
|
| 1661 | + * |
|
| 1662 | + * @return void |
|
| 1663 | + * @throws \EE_Error |
|
| 1664 | + */ |
|
| 1665 | + protected function _update_cached_related_model_objs_fks() |
|
| 1666 | + { |
|
| 1667 | + foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 1668 | + if ($relation_obj instanceof EE_Has_Many_Relation) { |
|
| 1669 | + foreach ($this->get_all_from_cache($relation_name) as $related_model_obj_in_cache) { |
|
| 1670 | + $fk_to_this = $related_model_obj_in_cache->get_model()->get_foreign_key_to( |
|
| 1671 | + $this->get_model()->get_this_model_name() |
|
| 1672 | + ); |
|
| 1673 | + $related_model_obj_in_cache->set($fk_to_this->get_name(), $this->ID()); |
|
| 1674 | + if ($related_model_obj_in_cache->ID()) { |
|
| 1675 | + $related_model_obj_in_cache->save(); |
|
| 1676 | + } |
|
| 1677 | + } |
|
| 1678 | + } |
|
| 1679 | + } |
|
| 1680 | + } |
|
| 1681 | + |
|
| 1682 | + |
|
| 1683 | + |
|
| 1684 | + /** |
|
| 1685 | + * Saves this model object and its NEW cached relations to the database. |
|
| 1686 | + * (Meaning, for now, IT DOES NOT WORK if the cached items already exist in the DB. |
|
| 1687 | + * In order for that to work, we would need to mark model objects as dirty/clean... |
|
| 1688 | + * because otherwise, there's a potential for infinite looping of saving |
|
| 1689 | + * Saves the cached related model objects, and ensures the relation between them |
|
| 1690 | + * and this object and properly setup |
|
| 1691 | + * |
|
| 1692 | + * @return int ID of new model object on save; 0 on failure+ |
|
| 1693 | + * @throws \EE_Error |
|
| 1694 | + */ |
|
| 1695 | + public function save_new_cached_related_model_objs() |
|
| 1696 | + { |
|
| 1697 | + //make sure this has been saved |
|
| 1698 | + if ( ! $this->ID()) { |
|
| 1699 | + $id = $this->save(); |
|
| 1700 | + } else { |
|
| 1701 | + $id = $this->ID(); |
|
| 1702 | + } |
|
| 1703 | + //now save all the NEW cached model objects (ie they don't exist in the DB) |
|
| 1704 | + foreach ($this->get_model()->relation_settings() as $relationName => $relationObj) { |
|
| 1705 | + if ($this->_model_relations[$relationName]) { |
|
| 1706 | + //is this a relation where we should expect just ONE related object (ie, EE_Belongs_To_relation) |
|
| 1707 | + //or MANY related objects (ie, EE_HABTM_Relation or EE_Has_Many_Relation)? |
|
| 1708 | + if ($relationObj instanceof EE_Belongs_To_Relation) { |
|
| 1709 | + //add a relation to that relation type (which saves the appropriate thing in the process) |
|
| 1710 | + //but ONLY if it DOES NOT exist in the DB |
|
| 1711 | + /* @var $related_model_obj EE_Base_Class */ |
|
| 1712 | + $related_model_obj = $this->_model_relations[$relationName]; |
|
| 1713 | + // if( ! $related_model_obj->ID()){ |
|
| 1714 | + $this->_add_relation_to($related_model_obj, $relationName); |
|
| 1715 | + $related_model_obj->save_new_cached_related_model_objs(); |
|
| 1716 | + // } |
|
| 1717 | + } else { |
|
| 1718 | + foreach ($this->_model_relations[$relationName] as $related_model_obj) { |
|
| 1719 | + //add a relation to that relation type (which saves the appropriate thing in the process) |
|
| 1720 | + //but ONLY if it DOES NOT exist in the DB |
|
| 1721 | + // if( ! $related_model_obj->ID()){ |
|
| 1722 | + $this->_add_relation_to($related_model_obj, $relationName); |
|
| 1723 | + $related_model_obj->save_new_cached_related_model_objs(); |
|
| 1724 | + // } |
|
| 1725 | + } |
|
| 1726 | + } |
|
| 1727 | + } |
|
| 1728 | + } |
|
| 1729 | + return $id; |
|
| 1730 | + } |
|
| 1731 | + |
|
| 1732 | + |
|
| 1733 | + |
|
| 1734 | + /** |
|
| 1735 | + * for getting a model while instantiated. |
|
| 1736 | + * |
|
| 1737 | + * @return \EEM_Base | \EEM_CPT_Base |
|
| 1738 | + */ |
|
| 1739 | + public function get_model() |
|
| 1740 | + { |
|
| 1741 | + $modelName = self::_get_model_classname(get_class($this)); |
|
| 1742 | + return self::_get_model_instance_with_name($modelName, $this->_timezone); |
|
| 1743 | + } |
|
| 1744 | + |
|
| 1745 | + |
|
| 1746 | + |
|
| 1747 | + /** |
|
| 1748 | + * @param $props_n_values |
|
| 1749 | + * @param $classname |
|
| 1750 | + * @return mixed bool|EE_Base_Class|EEM_CPT_Base |
|
| 1751 | + * @throws \EE_Error |
|
| 1752 | + */ |
|
| 1753 | + protected static function _get_object_from_entity_mapper($props_n_values, $classname) |
|
| 1754 | + { |
|
| 1755 | + //TODO: will not work for Term_Relationships because they have no PK! |
|
| 1756 | + $primary_id_ref = self::_get_primary_key_name($classname); |
|
| 1757 | + if (array_key_exists($primary_id_ref, $props_n_values) && ! empty($props_n_values[$primary_id_ref])) { |
|
| 1758 | + $id = $props_n_values[$primary_id_ref]; |
|
| 1759 | + return self::_get_model($classname)->get_from_entity_map($id); |
|
| 1760 | + } |
|
| 1761 | + return false; |
|
| 1762 | + } |
|
| 1763 | + |
|
| 1764 | + |
|
| 1765 | + |
|
| 1766 | + /** |
|
| 1767 | + * This is called by child static "new_instance" method and we'll check to see if there is an existing db entry for |
|
| 1768 | + * the primary key (if present in incoming values). If there is a key in the incoming array that matches the |
|
| 1769 | + * primary key for the model AND it is not null, then we check the db. If there's a an object we return it. If not |
|
| 1770 | + * we return false. |
|
| 1771 | + * |
|
| 1772 | + * @param array $props_n_values incoming array of properties and their values |
|
| 1773 | + * @param string $classname the classname of the child class |
|
| 1774 | + * @param null $timezone |
|
| 1775 | + * @param array $date_formats incoming date_formats in an array where the first value is the |
|
| 1776 | + * date_format and the second value is the time format |
|
| 1777 | + * @return mixed (EE_Base_Class|bool) |
|
| 1778 | + * @throws \EE_Error |
|
| 1779 | + */ |
|
| 1780 | + protected static function _check_for_object($props_n_values, $classname, $timezone = null, $date_formats = array()) |
|
| 1781 | + { |
|
| 1782 | + $existing = null; |
|
| 1783 | + if (self::_get_model($classname)->has_primary_key_field()) { |
|
| 1784 | + $primary_id_ref = self::_get_primary_key_name($classname); |
|
| 1785 | + if (array_key_exists($primary_id_ref, $props_n_values) |
|
| 1786 | + && ! empty($props_n_values[$primary_id_ref]) |
|
| 1787 | + ) { |
|
| 1788 | + $existing = self::_get_model($classname, $timezone)->get_one_by_ID( |
|
| 1789 | + $props_n_values[$primary_id_ref] |
|
| 1790 | + ); |
|
| 1791 | + } |
|
| 1792 | + } elseif (self::_get_model($classname, $timezone)->has_all_combined_primary_key_fields($props_n_values)) { |
|
| 1793 | + //no primary key on this model, but there's still a matching item in the DB |
|
| 1794 | + $existing = self::_get_model($classname, $timezone)->get_one_by_ID( |
|
| 1795 | + self::_get_model($classname, $timezone)->get_index_primary_key_string($props_n_values) |
|
| 1796 | + ); |
|
| 1797 | + } |
|
| 1798 | + if ($existing) { |
|
| 1799 | + //set date formats if present before setting values |
|
| 1800 | + if ( ! empty($date_formats) && is_array($date_formats)) { |
|
| 1801 | + $existing->set_date_format($date_formats[0]); |
|
| 1802 | + $existing->set_time_format($date_formats[1]); |
|
| 1803 | + } else { |
|
| 1804 | + //set default formats for date and time |
|
| 1805 | + $existing->set_date_format(get_option('date_format')); |
|
| 1806 | + $existing->set_time_format(get_option('time_format')); |
|
| 1807 | + } |
|
| 1808 | + foreach ($props_n_values as $property => $field_value) { |
|
| 1809 | + $existing->set($property, $field_value); |
|
| 1810 | + } |
|
| 1811 | + return $existing; |
|
| 1812 | + } else { |
|
| 1813 | + return false; |
|
| 1814 | + } |
|
| 1815 | + } |
|
| 1816 | + |
|
| 1817 | + |
|
| 1818 | + |
|
| 1819 | + /** |
|
| 1820 | + * Gets the EEM_*_Model for this class |
|
| 1821 | + * |
|
| 1822 | + * @access public now, as this is more convenient |
|
| 1823 | + * @param $classname |
|
| 1824 | + * @param null $timezone |
|
| 1825 | + * @throws EE_Error |
|
| 1826 | + * @return EEM_Base |
|
| 1827 | + */ |
|
| 1828 | + protected static function _get_model($classname, $timezone = null) |
|
| 1829 | + { |
|
| 1830 | + //find model for this class |
|
| 1831 | + if ( ! $classname) { |
|
| 1832 | + throw new EE_Error( |
|
| 1833 | + sprintf( |
|
| 1834 | + __( |
|
| 1835 | + "What were you thinking calling _get_model(%s)?? You need to specify the class name", |
|
| 1836 | + "event_espresso" |
|
| 1837 | + ), |
|
| 1838 | + $classname |
|
| 1839 | + ) |
|
| 1840 | + ); |
|
| 1841 | + } |
|
| 1842 | + $modelName = self::_get_model_classname($classname); |
|
| 1843 | + return self::_get_model_instance_with_name($modelName, $timezone); |
|
| 1844 | + } |
|
| 1845 | + |
|
| 1846 | + |
|
| 1847 | + |
|
| 1848 | + /** |
|
| 1849 | + * Gets the model instance (eg instance of EEM_Attendee) given its classname (eg EE_Attendee) |
|
| 1850 | + * |
|
| 1851 | + * @param string $model_classname |
|
| 1852 | + * @param null $timezone |
|
| 1853 | + * @return EEM_Base |
|
| 1854 | + */ |
|
| 1855 | + protected static function _get_model_instance_with_name($model_classname, $timezone = null) |
|
| 1856 | + { |
|
| 1857 | + $model_classname = str_replace('EEM_', '', $model_classname); |
|
| 1858 | + $model = EE_Registry::instance()->load_model($model_classname); |
|
| 1859 | + $model->set_timezone($timezone); |
|
| 1860 | + return $model; |
|
| 1861 | + } |
|
| 1862 | + |
|
| 1863 | + |
|
| 1864 | + |
|
| 1865 | + /** |
|
| 1866 | + * If a model name is provided (eg Registration), gets the model classname for that model. |
|
| 1867 | + * Also works if a model class's classname is provided (eg EE_Registration). |
|
| 1868 | + * |
|
| 1869 | + * @param null $model_name |
|
| 1870 | + * @return string like EEM_Attendee |
|
| 1871 | + */ |
|
| 1872 | + private static function _get_model_classname($model_name = null) |
|
| 1873 | + { |
|
| 1874 | + if (strpos($model_name, "EE_") === 0) { |
|
| 1875 | + $model_classname = str_replace("EE_", "EEM_", $model_name); |
|
| 1876 | + } else { |
|
| 1877 | + $model_classname = "EEM_" . $model_name; |
|
| 1878 | + } |
|
| 1879 | + return $model_classname; |
|
| 1880 | + } |
|
| 1881 | + |
|
| 1882 | + |
|
| 1883 | + |
|
| 1884 | + /** |
|
| 1885 | + * returns the name of the primary key attribute |
|
| 1886 | + * |
|
| 1887 | + * @param null $classname |
|
| 1888 | + * @throws EE_Error |
|
| 1889 | + * @return string |
|
| 1890 | + */ |
|
| 1891 | + protected static function _get_primary_key_name($classname = null) |
|
| 1892 | + { |
|
| 1893 | + if ( ! $classname) { |
|
| 1894 | + throw new EE_Error( |
|
| 1895 | + sprintf( |
|
| 1896 | + __("What were you thinking calling _get_primary_key_name(%s)", "event_espresso"), |
|
| 1897 | + $classname |
|
| 1898 | + ) |
|
| 1899 | + ); |
|
| 1900 | + } |
|
| 1901 | + return self::_get_model($classname)->get_primary_key_field()->get_name(); |
|
| 1902 | + } |
|
| 1903 | + |
|
| 1904 | + |
|
| 1905 | + |
|
| 1906 | + /** |
|
| 1907 | + * Gets the value of the primary key. |
|
| 1908 | + * If the object hasn't yet been saved, it should be whatever the model field's default was |
|
| 1909 | + * (eg, if this were the EE_Event class, look at the primary key field on EEM_Event and see what its default value |
|
| 1910 | + * is. Usually defaults for integer primary keys are 0; string primary keys are usually NULL). |
|
| 1911 | + * |
|
| 1912 | + * @return mixed, if the primary key is of type INT it'll be an int. Otherwise it could be a string |
|
| 1913 | + * @throws \EE_Error |
|
| 1914 | + */ |
|
| 1915 | + public function ID() |
|
| 1916 | + { |
|
| 1917 | + //now that we know the name of the variable, use a variable variable to get its value and return its |
|
| 1918 | + if ($this->get_model()->has_primary_key_field()) { |
|
| 1919 | + return $this->_fields[self::_get_primary_key_name(get_class($this))]; |
|
| 1920 | + } else { |
|
| 1921 | + return $this->get_model()->get_index_primary_key_string($this->_fields); |
|
| 1922 | + } |
|
| 1923 | + } |
|
| 1924 | + |
|
| 1925 | + |
|
| 1926 | + |
|
| 1927 | + /** |
|
| 1928 | + * Adds a relationship to the specified EE_Base_Class object, given the relationship's name. Eg, if the current |
|
| 1929 | + * model is related to a group of events, the $relationName should be 'Event', and should be a key in the EE |
|
| 1930 | + * Model's $_model_relations array. If this model object doesn't exist in the DB, just caches the related thing |
|
| 1931 | + * |
|
| 1932 | + * @param mixed $otherObjectModelObjectOrID EE_Base_Class or the ID of the other object |
|
| 1933 | + * @param string $relationName eg 'Events','Question',etc. |
|
| 1934 | + * an attendee to a group, you also want to specify which role they |
|
| 1935 | + * will have in that group. So you would use this parameter to |
|
| 1936 | + * specify array('role-column-name'=>'role-id') |
|
| 1937 | + * @param array $extra_join_model_fields_n_values You can optionally include an array of key=>value pairs that |
|
| 1938 | + * allow you to further constrict the relation to being added. |
|
| 1939 | + * However, keep in mind that the columns (keys) given must match a |
|
| 1940 | + * column on the JOIN table and currently only the HABTM models |
|
| 1941 | + * accept these additional conditions. Also remember that if an |
|
| 1942 | + * exact match isn't found for these extra cols/val pairs, then a |
|
| 1943 | + * NEW row is created in the join table. |
|
| 1944 | + * @param null $cache_id |
|
| 1945 | + * @throws EE_Error |
|
| 1946 | + * @return EE_Base_Class the object the relation was added to |
|
| 1947 | + */ |
|
| 1948 | + public function _add_relation_to( |
|
| 1949 | + $otherObjectModelObjectOrID, |
|
| 1950 | + $relationName, |
|
| 1951 | + $extra_join_model_fields_n_values = array(), |
|
| 1952 | + $cache_id = null |
|
| 1953 | + ) { |
|
| 1954 | + //if this thing exists in the DB, save the relation to the DB |
|
| 1955 | + if ($this->ID()) { |
|
| 1956 | + $otherObject = $this->get_model() |
|
| 1957 | + ->add_relationship_to($this, $otherObjectModelObjectOrID, $relationName, |
|
| 1958 | + $extra_join_model_fields_n_values); |
|
| 1959 | + //clear cache so future get_many_related and get_first_related() return new results. |
|
| 1960 | + $this->clear_cache($relationName, $otherObject, true); |
|
| 1961 | + if ($otherObject instanceof EE_Base_Class) { |
|
| 1962 | + $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 1963 | + } |
|
| 1964 | + } else { |
|
| 1965 | + //this thing doesn't exist in the DB, so just cache it |
|
| 1966 | + if ( ! $otherObjectModelObjectOrID instanceof EE_Base_Class) { |
|
| 1967 | + throw new EE_Error(sprintf( |
|
| 1968 | + __('Before a model object is saved to the database, calls to _add_relation_to must be passed an actual object, not just an ID. You provided %s as the model object to a %s', |
|
| 1969 | + 'event_espresso'), |
|
| 1970 | + $otherObjectModelObjectOrID, |
|
| 1971 | + get_class($this) |
|
| 1972 | + )); |
|
| 1973 | + } else { |
|
| 1974 | + $otherObject = $otherObjectModelObjectOrID; |
|
| 1975 | + } |
|
| 1976 | + $this->cache($relationName, $otherObjectModelObjectOrID, $cache_id); |
|
| 1977 | + } |
|
| 1978 | + if ($otherObject instanceof EE_Base_Class) { |
|
| 1979 | + //fix the reciprocal relation too |
|
| 1980 | + if ($otherObject->ID()) { |
|
| 1981 | + //its saved so assumed relations exist in the DB, so we can just |
|
| 1982 | + //clear the cache so future queries use the updated info in the DB |
|
| 1983 | + $otherObject->clear_cache($this->get_model()->get_this_model_name(), null, true); |
|
| 1984 | + } else { |
|
| 1985 | + //it's not saved, so it caches relations like this |
|
| 1986 | + $otherObject->cache($this->get_model()->get_this_model_name(), $this); |
|
| 1987 | + } |
|
| 1988 | + } |
|
| 1989 | + return $otherObject; |
|
| 1990 | + } |
|
| 1991 | + |
|
| 1992 | + |
|
| 1993 | + |
|
| 1994 | + /** |
|
| 1995 | + * Removes a relationship to the specified EE_Base_Class object, given the relationships' name. Eg, if the current |
|
| 1996 | + * model is related to a group of events, the $relationName should be 'Events', and should be a key in the EE |
|
| 1997 | + * Model's $_model_relations array. If this model object doesn't exist in the DB, just removes the related thing |
|
| 1998 | + * from the cache |
|
| 1999 | + * |
|
| 2000 | + * @param mixed $otherObjectModelObjectOrID |
|
| 2001 | + * EE_Base_Class or the ID of the other object, OR an array key into the cache if this isn't saved |
|
| 2002 | + * to the DB yet |
|
| 2003 | + * @param string $relationName |
|
| 2004 | + * @param array $where_query |
|
| 2005 | + * You can optionally include an array of key=>value pairs that allow you to further constrict the |
|
| 2006 | + * relation to being added. However, keep in mind that the columns (keys) given must match a column |
|
| 2007 | + * on the JOIN table and currently only the HABTM models accept these additional conditions. Also |
|
| 2008 | + * remember that if an exact match isn't found for these extra cols/val pairs, then a NEW row is |
|
| 2009 | + * created in the join table. |
|
| 2010 | + * @return EE_Base_Class the relation was removed from |
|
| 2011 | + * @throws \EE_Error |
|
| 2012 | + */ |
|
| 2013 | + public function _remove_relation_to($otherObjectModelObjectOrID, $relationName, $where_query = array()) |
|
| 2014 | + { |
|
| 2015 | + if ($this->ID()) { |
|
| 2016 | + //if this exists in the DB, save the relation change to the DB too |
|
| 2017 | + $otherObject = $this->get_model() |
|
| 2018 | + ->remove_relationship_to($this, $otherObjectModelObjectOrID, $relationName, |
|
| 2019 | + $where_query); |
|
| 2020 | + $this->clear_cache($relationName, $otherObject); |
|
| 2021 | + } else { |
|
| 2022 | + //this doesn't exist in the DB, just remove it from the cache |
|
| 2023 | + $otherObject = $this->clear_cache($relationName, $otherObjectModelObjectOrID); |
|
| 2024 | + } |
|
| 2025 | + if ($otherObject instanceof EE_Base_Class) { |
|
| 2026 | + $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 2027 | + } |
|
| 2028 | + return $otherObject; |
|
| 2029 | + } |
|
| 2030 | + |
|
| 2031 | + |
|
| 2032 | + |
|
| 2033 | + /** |
|
| 2034 | + * Removes ALL the related things for the $relationName. |
|
| 2035 | + * |
|
| 2036 | + * @param string $relationName |
|
| 2037 | + * @param array $where_query_params like EEM_Base::get_all's $query_params[0] (where conditions) |
|
| 2038 | + * @return EE_Base_Class |
|
| 2039 | + * @throws \EE_Error |
|
| 2040 | + */ |
|
| 2041 | + public function _remove_relations($relationName, $where_query_params = array()) |
|
| 2042 | + { |
|
| 2043 | + if ($this->ID()) { |
|
| 2044 | + //if this exists in the DB, save the relation change to the DB too |
|
| 2045 | + $otherObjects = $this->get_model()->remove_relations($this, $relationName, $where_query_params); |
|
| 2046 | + $this->clear_cache($relationName, null, true); |
|
| 2047 | + } else { |
|
| 2048 | + //this doesn't exist in the DB, just remove it from the cache |
|
| 2049 | + $otherObjects = $this->clear_cache($relationName, null, true); |
|
| 2050 | + } |
|
| 2051 | + if (is_array($otherObjects)) { |
|
| 2052 | + foreach ($otherObjects as $otherObject) { |
|
| 2053 | + $otherObject->clear_cache($this->get_model()->get_this_model_name(), $this); |
|
| 2054 | + } |
|
| 2055 | + } |
|
| 2056 | + return $otherObjects; |
|
| 2057 | + } |
|
| 2058 | + |
|
| 2059 | + |
|
| 2060 | + |
|
| 2061 | + /** |
|
| 2062 | + * Gets all the related model objects of the specified type. Eg, if the current class if |
|
| 2063 | + * EE_Event, you could call $this->get_many_related('Registration') to get an array of all the |
|
| 2064 | + * EE_Registration objects which related to this event. Note: by default, we remove the "default query params" |
|
| 2065 | + * because we want to get even deleted items etc. |
|
| 2066 | + * |
|
| 2067 | + * @param string $relationName key in the model's _model_relations array |
|
| 2068 | + * @param array $query_params like EEM_Base::get_all |
|
| 2069 | + * @return EE_Base_Class[] Results not necessarily indexed by IDs, because some results might not have primary keys |
|
| 2070 | + * @throws \EE_Error |
|
| 2071 | + * or might not be saved yet. Consider using EEM_Base::get_IDs() on these results if |
|
| 2072 | + * you want IDs |
|
| 2073 | + */ |
|
| 2074 | + public function get_many_related($relationName, $query_params = array()) |
|
| 2075 | + { |
|
| 2076 | + if ($this->ID()) { |
|
| 2077 | + //this exists in the DB, so get the related things from either the cache or the DB |
|
| 2078 | + //if there are query parameters, forget about caching the related model objects. |
|
| 2079 | + if ($query_params) { |
|
| 2080 | + $related_model_objects = $this->get_model()->get_all_related($this, $relationName, $query_params); |
|
| 2081 | + } else { |
|
| 2082 | + //did we already cache the result of this query? |
|
| 2083 | + $cached_results = $this->get_all_from_cache($relationName); |
|
| 2084 | + if ( ! $cached_results) { |
|
| 2085 | + $related_model_objects = $this->get_model()->get_all_related($this, $relationName, $query_params); |
|
| 2086 | + //if no query parameters were passed, then we got all the related model objects |
|
| 2087 | + //for that relation. We can cache them then. |
|
| 2088 | + foreach ($related_model_objects as $related_model_object) { |
|
| 2089 | + $this->cache($relationName, $related_model_object); |
|
| 2090 | + } |
|
| 2091 | + } else { |
|
| 2092 | + $related_model_objects = $cached_results; |
|
| 2093 | + } |
|
| 2094 | + } |
|
| 2095 | + } else { |
|
| 2096 | + //this doesn't exist in the DB, so just get the related things from the cache |
|
| 2097 | + $related_model_objects = $this->get_all_from_cache($relationName); |
|
| 2098 | + } |
|
| 2099 | + return $related_model_objects; |
|
| 2100 | + } |
|
| 2101 | + |
|
| 2102 | + |
|
| 2103 | + |
|
| 2104 | + /** |
|
| 2105 | + * Instead of getting the related model objects, simply counts them. Ignores default_where_conditions by default, |
|
| 2106 | + * unless otherwise specified in the $query_params |
|
| 2107 | + * |
|
| 2108 | + * @param string $relation_name model_name like 'Event', or 'Registration' |
|
| 2109 | + * @param array $query_params like EEM_Base::get_all's |
|
| 2110 | + * @param string $field_to_count name of field to count by. By default, uses primary key |
|
| 2111 | + * @param bool $distinct if we want to only count the distinct values for the column then you can trigger |
|
| 2112 | + * that by the setting $distinct to TRUE; |
|
| 2113 | + * @return int |
|
| 2114 | + */ |
|
| 2115 | + public function count_related($relation_name, $query_params = array(), $field_to_count = null, $distinct = false) |
|
| 2116 | + { |
|
| 2117 | + return $this->get_model()->count_related($this, $relation_name, $query_params, $field_to_count, $distinct); |
|
| 2118 | + } |
|
| 2119 | + |
|
| 2120 | + |
|
| 2121 | + |
|
| 2122 | + /** |
|
| 2123 | + * Instead of getting the related model objects, simply sums up the values of the specified field. |
|
| 2124 | + * Note: ignores default_where_conditions by default, unless otherwise specified in the $query_params |
|
| 2125 | + * |
|
| 2126 | + * @param string $relation_name model_name like 'Event', or 'Registration' |
|
| 2127 | + * @param array $query_params like EEM_Base::get_all's |
|
| 2128 | + * @param string $field_to_sum name of field to count by. |
|
| 2129 | + * By default, uses primary key (which doesn't make much sense, so you should probably |
|
| 2130 | + * change it) |
|
| 2131 | + * @return int |
|
| 2132 | + */ |
|
| 2133 | + public function sum_related($relation_name, $query_params = array(), $field_to_sum = null) |
|
| 2134 | + { |
|
| 2135 | + return $this->get_model()->sum_related($this, $relation_name, $query_params, $field_to_sum); |
|
| 2136 | + } |
|
| 2137 | + |
|
| 2138 | + |
|
| 2139 | + |
|
| 2140 | + /** |
|
| 2141 | + * Gets the first (ie, one) related model object of the specified type. |
|
| 2142 | + * |
|
| 2143 | + * @param string $relationName key in the model's _model_relations array |
|
| 2144 | + * @param array $query_params like EEM_Base::get_all |
|
| 2145 | + * @return EE_Base_Class (not an array, a single object) |
|
| 2146 | + * @throws \EE_Error |
|
| 2147 | + */ |
|
| 2148 | + public function get_first_related($relationName, $query_params = array()) |
|
| 2149 | + { |
|
| 2150 | + if ($this->ID()) {//this exists in the DB, get from the cache OR the DB |
|
| 2151 | + //if they've provided some query parameters, don't bother trying to cache the result |
|
| 2152 | + //also make sure we're not caching the result of get_first_related |
|
| 2153 | + //on a relation which should have an array of objects (because the cache might have an array of objects) |
|
| 2154 | + if ($query_params |
|
| 2155 | + || ! $this->get_model()->related_settings_for($relationName) |
|
| 2156 | + instanceof |
|
| 2157 | + EE_Belongs_To_Relation |
|
| 2158 | + ) { |
|
| 2159 | + $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2160 | + } else { |
|
| 2161 | + //first, check if we've already cached the result of this query |
|
| 2162 | + $cached_result = $this->get_one_from_cache($relationName); |
|
| 2163 | + if ( ! $cached_result) { |
|
| 2164 | + $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2165 | + $this->cache($relationName, $related_model_object); |
|
| 2166 | + } else { |
|
| 2167 | + $related_model_object = $cached_result; |
|
| 2168 | + } |
|
| 2169 | + } |
|
| 2170 | + } else { |
|
| 2171 | + $related_model_object = null; |
|
| 2172 | + //this doesn't exist in the Db, but maybe the relation is of type belongs to, and so the related thing might |
|
| 2173 | + if ($this->get_model()->related_settings_for($relationName) instanceof EE_Belongs_To_Relation) { |
|
| 2174 | + $related_model_object = $this->get_model()->get_first_related($this, $relationName, $query_params); |
|
| 2175 | + } |
|
| 2176 | + //this doesn't exist in the DB and apparently the thing it belongs to doesn't either, just get what's cached on this object |
|
| 2177 | + if ( ! $related_model_object) { |
|
| 2178 | + $related_model_object = $this->get_one_from_cache($relationName); |
|
| 2179 | + } |
|
| 2180 | + } |
|
| 2181 | + return $related_model_object; |
|
| 2182 | + } |
|
| 2183 | + |
|
| 2184 | + |
|
| 2185 | + |
|
| 2186 | + /** |
|
| 2187 | + * Does a delete on all related objects of type $relationName and removes |
|
| 2188 | + * the current model object's relation to them. If they can't be deleted (because |
|
| 2189 | + * of blocking related model objects) does nothing. If the related model objects are |
|
| 2190 | + * soft-deletable, they will be soft-deleted regardless of related blocking model objects. |
|
| 2191 | + * If this model object doesn't exist yet in the DB, just removes its related things |
|
| 2192 | + * |
|
| 2193 | + * @param string $relationName |
|
| 2194 | + * @param array $query_params like EEM_Base::get_all's |
|
| 2195 | + * @return int how many deleted |
|
| 2196 | + * @throws \EE_Error |
|
| 2197 | + */ |
|
| 2198 | + public function delete_related($relationName, $query_params = array()) |
|
| 2199 | + { |
|
| 2200 | + if ($this->ID()) { |
|
| 2201 | + $count = $this->get_model()->delete_related($this, $relationName, $query_params); |
|
| 2202 | + } else { |
|
| 2203 | + $count = count($this->get_all_from_cache($relationName)); |
|
| 2204 | + $this->clear_cache($relationName, null, true); |
|
| 2205 | + } |
|
| 2206 | + return $count; |
|
| 2207 | + } |
|
| 2208 | + |
|
| 2209 | + |
|
| 2210 | + |
|
| 2211 | + /** |
|
| 2212 | + * Does a hard delete (ie, removes the DB row) on all related objects of type $relationName and removes |
|
| 2213 | + * the current model object's relation to them. If they can't be deleted (because |
|
| 2214 | + * of blocking related model objects) just does a soft delete on it instead, if possible. |
|
| 2215 | + * If the related thing isn't a soft-deletable model object, this function is identical |
|
| 2216 | + * to delete_related(). If this model object doesn't exist in the DB, just remove its related things |
|
| 2217 | + * |
|
| 2218 | + * @param string $relationName |
|
| 2219 | + * @param array $query_params like EEM_Base::get_all's |
|
| 2220 | + * @return int how many deleted (including those soft deleted) |
|
| 2221 | + * @throws \EE_Error |
|
| 2222 | + */ |
|
| 2223 | + public function delete_related_permanently($relationName, $query_params = array()) |
|
| 2224 | + { |
|
| 2225 | + if ($this->ID()) { |
|
| 2226 | + $count = $this->get_model()->delete_related_permanently($this, $relationName, $query_params); |
|
| 2227 | + } else { |
|
| 2228 | + $count = count($this->get_all_from_cache($relationName)); |
|
| 2229 | + } |
|
| 2230 | + $this->clear_cache($relationName, null, true); |
|
| 2231 | + return $count; |
|
| 2232 | + } |
|
| 2233 | + |
|
| 2234 | + |
|
| 2235 | + |
|
| 2236 | + /** |
|
| 2237 | + * is_set |
|
| 2238 | + * Just a simple utility function children can use for checking if property exists |
|
| 2239 | + * |
|
| 2240 | + * @access public |
|
| 2241 | + * @param string $field_name property to check |
|
| 2242 | + * @return bool TRUE if existing,FALSE if not. |
|
| 2243 | + */ |
|
| 2244 | + public function is_set($field_name) |
|
| 2245 | + { |
|
| 2246 | + return isset($this->_fields[$field_name]); |
|
| 2247 | + } |
|
| 2248 | + |
|
| 2249 | + |
|
| 2250 | + |
|
| 2251 | + /** |
|
| 2252 | + * Just a simple utility function children can use for checking if property (or properties) exists and throwing an |
|
| 2253 | + * EE_Error exception if they don't |
|
| 2254 | + * |
|
| 2255 | + * @param mixed (string|array) $properties properties to check |
|
| 2256 | + * @throws EE_Error |
|
| 2257 | + * @return bool TRUE if existing, throw EE_Error if not. |
|
| 2258 | + */ |
|
| 2259 | + protected function _property_exists($properties) |
|
| 2260 | + { |
|
| 2261 | + foreach ((array)$properties as $property_name) { |
|
| 2262 | + //first make sure this property exists |
|
| 2263 | + if ( ! $this->_fields[$property_name]) { |
|
| 2264 | + throw new EE_Error( |
|
| 2265 | + sprintf( |
|
| 2266 | + __( |
|
| 2267 | + 'Trying to retrieve a non-existent property (%s). Double check the spelling please', |
|
| 2268 | + 'event_espresso' |
|
| 2269 | + ), |
|
| 2270 | + $property_name |
|
| 2271 | + ) |
|
| 2272 | + ); |
|
| 2273 | + } |
|
| 2274 | + } |
|
| 2275 | + return true; |
|
| 2276 | + } |
|
| 2277 | + |
|
| 2278 | + |
|
| 2279 | + |
|
| 2280 | + /** |
|
| 2281 | + * This simply returns an array of model fields for this object |
|
| 2282 | + * |
|
| 2283 | + * @return array |
|
| 2284 | + * @throws \EE_Error |
|
| 2285 | + */ |
|
| 2286 | + public function model_field_array() |
|
| 2287 | + { |
|
| 2288 | + $fields = $this->get_model()->field_settings(false); |
|
| 2289 | + $properties = array(); |
|
| 2290 | + //remove prepended underscore |
|
| 2291 | + foreach ($fields as $field_name => $settings) { |
|
| 2292 | + $properties[$field_name] = $this->get($field_name); |
|
| 2293 | + } |
|
| 2294 | + return $properties; |
|
| 2295 | + } |
|
| 2296 | + |
|
| 2297 | + |
|
| 2298 | + |
|
| 2299 | + /** |
|
| 2300 | + * Very handy general function to allow for plugins to extend any child of EE_Base_Class. |
|
| 2301 | + * If a method is called on a child of EE_Base_Class that doesn't exist, this function is called |
|
| 2302 | + * (http://www.garfieldtech.com/blog/php-magic-call) and passed the method's name and arguments. Instead of |
|
| 2303 | + * requiring a plugin to extend the EE_Base_Class (which works fine is there's only 1 plugin, but when will that |
|
| 2304 | + * happen?) they can add a hook onto 'filters_hook_espresso__{className}__{methodName}' (eg, |
|
| 2305 | + * filters_hook_espresso__EE_Answer__my_great_function) and accepts 2 arguments: the object on which the function |
|
| 2306 | + * was called, and an array of the original arguments passed to the function. Whatever their callback function |
|
| 2307 | + * returns will be returned by this function. Example: in functions.php (or in a plugin): |
|
| 2308 | + * add_filter('FHEE__EE_Answer__my_callback','my_callback',10,3); function |
|
| 2309 | + * my_callback($previousReturnValue,EE_Base_Class $object,$argsArray){ |
|
| 2310 | + * $returnString= "you called my_callback! and passed args:".implode(",",$argsArray); |
|
| 2311 | + * return $previousReturnValue.$returnString; |
|
| 2312 | + * } |
|
| 2313 | + * require('EE_Answer.class.php'); |
|
| 2314 | + * $answer= EE_Answer::new_instance(array('REG_ID' => 2,'QST_ID' => 3,'ANS_value' => The answer is 42')); |
|
| 2315 | + * echo $answer->my_callback('monkeys',100); |
|
| 2316 | + * //will output "you called my_callback! and passed args:monkeys,100" |
|
| 2317 | + * |
|
| 2318 | + * @param string $methodName name of method which was called on a child of EE_Base_Class, but which |
|
| 2319 | + * @param array $args array of original arguments passed to the function |
|
| 2320 | + * @throws EE_Error |
|
| 2321 | + * @return mixed whatever the plugin which calls add_filter decides |
|
| 2322 | + */ |
|
| 2323 | + public function __call($methodName, $args) |
|
| 2324 | + { |
|
| 2325 | + $className = get_class($this); |
|
| 2326 | + $tagName = "FHEE__{$className}__{$methodName}"; |
|
| 2327 | + if ( ! has_filter($tagName)) { |
|
| 2328 | + throw new EE_Error( |
|
| 2329 | + sprintf( |
|
| 2330 | + __( |
|
| 2331 | + "Method %s on class %s does not exist! You can create one with the following code in functions.php or in a plugin: add_filter('%s','my_callback',10,3);function my_callback(\$previousReturnValue,EE_Base_Class \$object, \$argsArray){/*function body*/return \$whatever;}", |
|
| 2332 | + "event_espresso" |
|
| 2333 | + ), |
|
| 2334 | + $methodName, |
|
| 2335 | + $className, |
|
| 2336 | + $tagName |
|
| 2337 | + ) |
|
| 2338 | + ); |
|
| 2339 | + } |
|
| 2340 | + return apply_filters($tagName, null, $this, $args); |
|
| 2341 | + } |
|
| 2342 | + |
|
| 2343 | + |
|
| 2344 | + |
|
| 2345 | + /** |
|
| 2346 | + * Similar to insert_post_meta, adds a record in the Extra_Meta model's table with the given key and value. |
|
| 2347 | + * A $previous_value can be specified in case there are many meta rows with the same key |
|
| 2348 | + * |
|
| 2349 | + * @param string $meta_key |
|
| 2350 | + * @param string $meta_value |
|
| 2351 | + * @param string $previous_value |
|
| 2352 | + * @return int records updated (or BOOLEAN if we actually ended up inserting the extra meta row) |
|
| 2353 | + * @throws \EE_Error |
|
| 2354 | + * NOTE: if the values haven't changed, returns 0 |
|
| 2355 | + */ |
|
| 2356 | + public function update_extra_meta($meta_key, $meta_value, $previous_value = null) |
|
| 2357 | + { |
|
| 2358 | + $query_params = array( |
|
| 2359 | + array( |
|
| 2360 | + 'EXM_key' => $meta_key, |
|
| 2361 | + 'OBJ_ID' => $this->ID(), |
|
| 2362 | + 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2363 | + ), |
|
| 2364 | + ); |
|
| 2365 | + if ($previous_value !== null) { |
|
| 2366 | + $query_params[0]['EXM_value'] = $meta_value; |
|
| 2367 | + } |
|
| 2368 | + $existing_rows_like_that = EEM_Extra_Meta::instance()->get_all($query_params); |
|
| 2369 | + if ( ! $existing_rows_like_that) { |
|
| 2370 | + return $this->add_extra_meta($meta_key, $meta_value); |
|
| 2371 | + } else { |
|
| 2372 | + foreach ($existing_rows_like_that as $existing_row) { |
|
| 2373 | + $existing_row->save(array('EXM_value' => $meta_value)); |
|
| 2374 | + } |
|
| 2375 | + return count($existing_rows_like_that); |
|
| 2376 | + } |
|
| 2377 | + } |
|
| 2378 | + |
|
| 2379 | + |
|
| 2380 | + |
|
| 2381 | + /** |
|
| 2382 | + * Adds a new extra meta record. If $unique is set to TRUE, we'll first double-check |
|
| 2383 | + * no other extra meta for this model object have the same key. Returns TRUE if the |
|
| 2384 | + * extra meta row was entered, false if not |
|
| 2385 | + * |
|
| 2386 | + * @param string $meta_key |
|
| 2387 | + * @param string $meta_value |
|
| 2388 | + * @param boolean $unique |
|
| 2389 | + * @return boolean |
|
| 2390 | + * @throws \EE_Error |
|
| 2391 | + */ |
|
| 2392 | + public function add_extra_meta($meta_key, $meta_value, $unique = false) |
|
| 2393 | + { |
|
| 2394 | + if ($unique) { |
|
| 2395 | + $existing_extra_meta = EEM_Extra_Meta::instance()->get_one( |
|
| 2396 | + array( |
|
| 2397 | + array( |
|
| 2398 | + 'EXM_key' => $meta_key, |
|
| 2399 | + 'OBJ_ID' => $this->ID(), |
|
| 2400 | + 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2401 | + ), |
|
| 2402 | + ) |
|
| 2403 | + ); |
|
| 2404 | + if ($existing_extra_meta) { |
|
| 2405 | + return false; |
|
| 2406 | + } |
|
| 2407 | + } |
|
| 2408 | + $new_extra_meta = EE_Extra_Meta::new_instance( |
|
| 2409 | + array( |
|
| 2410 | + 'EXM_key' => $meta_key, |
|
| 2411 | + 'EXM_value' => $meta_value, |
|
| 2412 | + 'OBJ_ID' => $this->ID(), |
|
| 2413 | + 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2414 | + ) |
|
| 2415 | + ); |
|
| 2416 | + $new_extra_meta->save(); |
|
| 2417 | + return true; |
|
| 2418 | + } |
|
| 2419 | + |
|
| 2420 | + |
|
| 2421 | + |
|
| 2422 | + /** |
|
| 2423 | + * Deletes all the extra meta rows for this record as specified by key. If $meta_value |
|
| 2424 | + * is specified, only deletes extra meta records with that value. |
|
| 2425 | + * |
|
| 2426 | + * @param string $meta_key |
|
| 2427 | + * @param string $meta_value |
|
| 2428 | + * @return int number of extra meta rows deleted |
|
| 2429 | + * @throws \EE_Error |
|
| 2430 | + */ |
|
| 2431 | + public function delete_extra_meta($meta_key, $meta_value = null) |
|
| 2432 | + { |
|
| 2433 | + $query_params = array( |
|
| 2434 | + array( |
|
| 2435 | + 'EXM_key' => $meta_key, |
|
| 2436 | + 'OBJ_ID' => $this->ID(), |
|
| 2437 | + 'EXM_type' => $this->get_model()->get_this_model_name(), |
|
| 2438 | + ), |
|
| 2439 | + ); |
|
| 2440 | + if ($meta_value !== null) { |
|
| 2441 | + $query_params[0]['EXM_value'] = $meta_value; |
|
| 2442 | + } |
|
| 2443 | + return EEM_Extra_Meta::instance()->delete($query_params); |
|
| 2444 | + } |
|
| 2445 | + |
|
| 2446 | + |
|
| 2447 | + |
|
| 2448 | + /** |
|
| 2449 | + * Gets the extra meta with the given meta key. If you specify "single" we just return 1, otherwise |
|
| 2450 | + * an array of everything found. Requires that this model actually have a relation of type EE_Has_Many_Any_Relation. |
|
| 2451 | + * You can specify $default is case you haven't found the extra meta |
|
| 2452 | + * |
|
| 2453 | + * @param string $meta_key |
|
| 2454 | + * @param boolean $single |
|
| 2455 | + * @param mixed $default if we don't find anything, what should we return? |
|
| 2456 | + * @return mixed single value if $single; array if ! $single |
|
| 2457 | + * @throws \EE_Error |
|
| 2458 | + */ |
|
| 2459 | + public function get_extra_meta($meta_key, $single = false, $default = null) |
|
| 2460 | + { |
|
| 2461 | + if ($single) { |
|
| 2462 | + $result = $this->get_first_related('Extra_Meta', array(array('EXM_key' => $meta_key))); |
|
| 2463 | + if ($result instanceof EE_Extra_Meta) { |
|
| 2464 | + return $result->value(); |
|
| 2465 | + } else { |
|
| 2466 | + return $default; |
|
| 2467 | + } |
|
| 2468 | + } else { |
|
| 2469 | + $results = $this->get_many_related('Extra_Meta', array(array('EXM_key' => $meta_key))); |
|
| 2470 | + if ($results) { |
|
| 2471 | + $values = array(); |
|
| 2472 | + foreach ($results as $result) { |
|
| 2473 | + if ($result instanceof EE_Extra_Meta) { |
|
| 2474 | + $values[$result->ID()] = $result->value(); |
|
| 2475 | + } |
|
| 2476 | + } |
|
| 2477 | + return $values; |
|
| 2478 | + } else { |
|
| 2479 | + return $default; |
|
| 2480 | + } |
|
| 2481 | + } |
|
| 2482 | + } |
|
| 2483 | + |
|
| 2484 | + |
|
| 2485 | + |
|
| 2486 | + /** |
|
| 2487 | + * Returns a simple array of all the extra meta associated with this model object. |
|
| 2488 | + * If $one_of_each_key is true (Default), it will be an array of simple key-value pairs, keys being the |
|
| 2489 | + * extra meta's key, and teh value being its value. However, if there are duplicate extra meta rows with |
|
| 2490 | + * the same key, only one will be used. (eg array('foo'=>'bar','monkey'=>123)) |
|
| 2491 | + * If $one_of_each_key is false, it will return an array with the top-level keys being |
|
| 2492 | + * the extra meta keys, but their values are also arrays, which have the extra-meta's ID as their sub-key, and |
|
| 2493 | + * finally the extra meta's value as each sub-value. (eg |
|
| 2494 | + * array('foo'=>array(1=>'bar',2=>'bill'),'monkey'=>array(3=>123))) |
|
| 2495 | + * |
|
| 2496 | + * @param boolean $one_of_each_key |
|
| 2497 | + * @return array |
|
| 2498 | + * @throws \EE_Error |
|
| 2499 | + */ |
|
| 2500 | + public function all_extra_meta_array($one_of_each_key = true) |
|
| 2501 | + { |
|
| 2502 | + $return_array = array(); |
|
| 2503 | + if ($one_of_each_key) { |
|
| 2504 | + $extra_meta_objs = $this->get_many_related('Extra_Meta', array('group_by' => 'EXM_key')); |
|
| 2505 | + foreach ($extra_meta_objs as $extra_meta_obj) { |
|
| 2506 | + if ($extra_meta_obj instanceof EE_Extra_Meta) { |
|
| 2507 | + $return_array[$extra_meta_obj->key()] = $extra_meta_obj->value(); |
|
| 2508 | + } |
|
| 2509 | + } |
|
| 2510 | + } else { |
|
| 2511 | + $extra_meta_objs = $this->get_many_related('Extra_Meta'); |
|
| 2512 | + foreach ($extra_meta_objs as $extra_meta_obj) { |
|
| 2513 | + if ($extra_meta_obj instanceof EE_Extra_Meta) { |
|
| 2514 | + if ( ! isset($return_array[$extra_meta_obj->key()])) { |
|
| 2515 | + $return_array[$extra_meta_obj->key()] = array(); |
|
| 2516 | + } |
|
| 2517 | + $return_array[$extra_meta_obj->key()][$extra_meta_obj->ID()] = $extra_meta_obj->value(); |
|
| 2518 | + } |
|
| 2519 | + } |
|
| 2520 | + } |
|
| 2521 | + return $return_array; |
|
| 2522 | + } |
|
| 2523 | + |
|
| 2524 | + |
|
| 2525 | + |
|
| 2526 | + /** |
|
| 2527 | + * Gets a pretty nice displayable nice for this model object. Often overridden |
|
| 2528 | + * |
|
| 2529 | + * @return string |
|
| 2530 | + * @throws \EE_Error |
|
| 2531 | + */ |
|
| 2532 | + public function name() |
|
| 2533 | + { |
|
| 2534 | + //find a field that's not a text field |
|
| 2535 | + $field_we_can_use = $this->get_model()->get_a_field_of_type('EE_Text_Field_Base'); |
|
| 2536 | + if ($field_we_can_use) { |
|
| 2537 | + return $this->get($field_we_can_use->get_name()); |
|
| 2538 | + } else { |
|
| 2539 | + $first_few_properties = $this->model_field_array(); |
|
| 2540 | + $first_few_properties = array_slice($first_few_properties, 0, 3); |
|
| 2541 | + $name_parts = array(); |
|
| 2542 | + foreach ($first_few_properties as $name => $value) { |
|
| 2543 | + $name_parts[] = "$name:$value"; |
|
| 2544 | + } |
|
| 2545 | + return implode(",", $name_parts); |
|
| 2546 | + } |
|
| 2547 | + } |
|
| 2548 | + |
|
| 2549 | + |
|
| 2550 | + |
|
| 2551 | + /** |
|
| 2552 | + * in_entity_map |
|
| 2553 | + * Checks if this model object has been proven to already be in the entity map |
|
| 2554 | + * |
|
| 2555 | + * @return boolean |
|
| 2556 | + * @throws \EE_Error |
|
| 2557 | + */ |
|
| 2558 | + public function in_entity_map() |
|
| 2559 | + { |
|
| 2560 | + if ($this->ID() && $this->get_model()->get_from_entity_map($this->ID()) === $this) { |
|
| 2561 | + //well, if we looked, did we find it in the entity map? |
|
| 2562 | + return true; |
|
| 2563 | + } else { |
|
| 2564 | + return false; |
|
| 2565 | + } |
|
| 2566 | + } |
|
| 2567 | + |
|
| 2568 | + |
|
| 2569 | + |
|
| 2570 | + /** |
|
| 2571 | + * refresh_from_db |
|
| 2572 | + * Makes sure the fields and values on this model object are in-sync with what's in the database. |
|
| 2573 | + * |
|
| 2574 | + * @throws EE_Error if this model object isn't in the entity mapper (because then you should |
|
| 2575 | + * just use what's in the entity mapper and refresh it) and WP_DEBUG is TRUE |
|
| 2576 | + */ |
|
| 2577 | + public function refresh_from_db() |
|
| 2578 | + { |
|
| 2579 | + if ($this->ID() && $this->in_entity_map()) { |
|
| 2580 | + $this->get_model()->refresh_entity_map_from_db($this->ID()); |
|
| 2581 | + } else { |
|
| 2582 | + //if it doesn't have ID, you shouldn't be asking to refresh it from teh database (because its not in the database) |
|
| 2583 | + //if it has an ID but it's not in the map, and you're asking me to refresh it |
|
| 2584 | + //that's kinda dangerous. You should just use what's in the entity map, or add this to the entity map if there's |
|
| 2585 | + //absolutely nothing in it for this ID |
|
| 2586 | + if (WP_DEBUG) { |
|
| 2587 | + throw new EE_Error( |
|
| 2588 | + sprintf( |
|
| 2589 | + __('Trying to refresh a model object with ID "%1$s" that\'s not in the entity map? First off: you should put it in the entity map by calling %2$s. Second off, if you want what\'s in the database right now, you should just call %3$s yourself and discard this model object.', |
|
| 2590 | + 'event_espresso'), |
|
| 2591 | + $this->ID(), |
|
| 2592 | + get_class($this->get_model()) . '::instance()->add_to_entity_map()', |
|
| 2593 | + get_class($this->get_model()) . '::instance()->refresh_entity_map()' |
|
| 2594 | + ) |
|
| 2595 | + ); |
|
| 2596 | + } |
|
| 2597 | + } |
|
| 2598 | + } |
|
| 2599 | + |
|
| 2600 | + |
|
| 2601 | + |
|
| 2602 | + /** |
|
| 2603 | + * Because some other plugins, like Advanced Cron Manager, expect all objects to have this method |
|
| 2604 | + * (probably a bad assumption they have made, oh well) |
|
| 2605 | + * |
|
| 2606 | + * @return string |
|
| 2607 | + */ |
|
| 2608 | + public function __toString() |
|
| 2609 | + { |
|
| 2610 | + try { |
|
| 2611 | + return sprintf('%s (%s)', $this->name(), $this->ID()); |
|
| 2612 | + } catch (Exception $e) { |
|
| 2613 | + EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__); |
|
| 2614 | + return ''; |
|
| 2615 | + } |
|
| 2616 | + } |
|
| 2617 | + |
|
| 2618 | + |
|
| 2619 | + |
|
| 2620 | + /** |
|
| 2621 | + * Clear related model objects if they're already in the DB, because otherwise when we |
|
| 2622 | + * UN-serialize this model object we'll need to be careful to add them to the entity map. |
|
| 2623 | + * This means if we have made changes to those related model objects, and want to unserialize |
|
| 2624 | + * the this model object on a subsequent request, changes to those related model objects will be lost. |
|
| 2625 | + * Instead, those related model objects should be directly serialized and stored. |
|
| 2626 | + * Eg, the following won't work: |
|
| 2627 | + * $reg = EEM_Registration::instance()->get_one_by_ID( 123 ); |
|
| 2628 | + * $att = $reg->attendee(); |
|
| 2629 | + * $att->set( 'ATT_fname', 'Dirk' ); |
|
| 2630 | + * update_option( 'my_option', serialize( $reg ) ); |
|
| 2631 | + * //END REQUEST |
|
| 2632 | + * //START NEXT REQUEST |
|
| 2633 | + * $reg = get_option( 'my_option' ); |
|
| 2634 | + * $reg->attendee()->save(); |
|
| 2635 | + * And would need to be replace with: |
|
| 2636 | + * $reg = EEM_Registration::instance()->get_one_by_ID( 123 ); |
|
| 2637 | + * $att = $reg->attendee(); |
|
| 2638 | + * $att->set( 'ATT_fname', 'Dirk' ); |
|
| 2639 | + * update_option( 'my_option', serialize( $reg ) ); |
|
| 2640 | + * //END REQUEST |
|
| 2641 | + * //START NEXT REQUEST |
|
| 2642 | + * $att = get_option( 'my_option' ); |
|
| 2643 | + * $att->save(); |
|
| 2644 | + * |
|
| 2645 | + * @return array |
|
| 2646 | + * @throws \EE_Error |
|
| 2647 | + */ |
|
| 2648 | + public function __sleep() |
|
| 2649 | + { |
|
| 2650 | + foreach ($this->get_model()->relation_settings() as $relation_name => $relation_obj) { |
|
| 2651 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 2652 | + $classname = 'EE_' . $this->get_model()->get_this_model_name(); |
|
| 2653 | + if ( |
|
| 2654 | + $this->get_one_from_cache($relation_name) instanceof $classname |
|
| 2655 | + && $this->get_one_from_cache($relation_name)->ID() |
|
| 2656 | + ) { |
|
| 2657 | + $this->clear_cache($relation_name, $this->get_one_from_cache($relation_name)->ID()); |
|
| 2658 | + } |
|
| 2659 | + } |
|
| 2660 | + } |
|
| 2661 | + $this->_props_n_values_provided_in_constructor = array(); |
|
| 2662 | + return array_keys(get_object_vars($this)); |
|
| 2663 | + } |
|
| 2664 | + |
|
| 2665 | + |
|
| 2666 | + |
|
| 2667 | + /** |
|
| 2668 | + * restore _props_n_values_provided_in_constructor |
|
| 2669 | + * PLZ NOTE: this will reset the array to whatever fields values were present prior to serialization, |
|
| 2670 | + * and therefore should NOT be used to determine if state change has occurred since initial construction. |
|
| 2671 | + * At best, you would only be able to detect if state change has occurred during THIS request. |
|
| 2672 | + */ |
|
| 2673 | + public function __wakeup() |
|
| 2674 | + { |
|
| 2675 | + $this->_props_n_values_provided_in_constructor = $this->_fields; |
|
| 2676 | + } |
|
| 2677 | 2677 | |
| 2678 | 2678 | |
| 2679 | 2679 | |
@@ -17,122 +17,122 @@ |
||
| 17 | 17 | class GatewayDataFormatter implements GatewayDataFormatterInterface |
| 18 | 18 | { |
| 19 | 19 | |
| 20 | - /** |
|
| 21 | - * Gets the text to use for a gateway's line item name when this is a partial payment |
|
| 22 | - * |
|
| 23 | - * @param \EEI_Payment $payment |
|
| 24 | - * @return string |
|
| 25 | - */ |
|
| 26 | - public function formatPartialPaymentLineItemName(\EEI_Payment $payment) |
|
| 27 | - { |
|
| 28 | - return apply_filters( |
|
| 29 | - 'EEG_Paypal_Pro__do_direct_payment__partial_amount_line_item_name', |
|
| 30 | - $payment->get_first_event_name(), |
|
| 31 | - $this, |
|
| 32 | - $payment |
|
| 33 | - ); |
|
| 34 | - } |
|
| 35 | - |
|
| 36 | - |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * Gets the text to use for a gateway's line item description when this is a partial payment |
|
| 40 | - * |
|
| 41 | - * @param \EEI_Payment $payment |
|
| 42 | - * @return string |
|
| 43 | - */ |
|
| 44 | - public function formatPartialPaymentLineItemDesc(\EEI_Payment $payment) |
|
| 45 | - { |
|
| 46 | - return apply_filters( |
|
| 47 | - 'FHEE__EE_Gateway___partial_payment_desc', |
|
| 48 | - sprintf( |
|
| 49 | - __("Payment of %s for %s", "event_espresso"), |
|
| 50 | - $payment->get_pretty('PAY_amount', 'no_currency_code'), |
|
| 51 | - $payment->get_first_event_name() |
|
| 52 | - ), |
|
| 53 | - $this, |
|
| 54 | - $payment |
|
| 55 | - ); |
|
| 56 | - } |
|
| 57 | - |
|
| 58 | - |
|
| 59 | - |
|
| 60 | - /** |
|
| 61 | - * Gets the name to use for a line item when sending line items to the gateway |
|
| 62 | - * |
|
| 63 | - * @param \EEI_Line_Item $line_item |
|
| 64 | - * @param \EEI_Payment $payment |
|
| 65 | - * @return string |
|
| 66 | - */ |
|
| 67 | - public function formatLineItemName(\EEI_Line_Item $line_item, \EEI_Payment $payment) |
|
| 68 | - { |
|
| 69 | - return apply_filters( |
|
| 70 | - 'FHEE__EE_gateway___line_item_name', |
|
| 71 | - sprintf( |
|
| 72 | - _x('%1$s for %2$s', 'Ticket for Event', 'event_espresso'), |
|
| 73 | - $line_item->name(), |
|
| 74 | - $line_item->ticket_event_name() |
|
| 75 | - ), |
|
| 76 | - $this, |
|
| 77 | - $line_item, |
|
| 78 | - $payment |
|
| 79 | - ); |
|
| 80 | - } |
|
| 81 | - |
|
| 82 | - |
|
| 83 | - |
|
| 84 | - /** |
|
| 85 | - * Gets the description to use for a line item when sending line items to the gateway |
|
| 86 | - * |
|
| 87 | - * @param \EEI_Line_Item $line_item |
|
| 88 | - * @param \EEI_Payment $payment |
|
| 89 | - * @return string |
|
| 90 | - */ |
|
| 91 | - public function formatLineItemDesc(\EEI_Line_Item $line_item, \EEI_Payment $payment) |
|
| 92 | - { |
|
| 93 | - return apply_filters( |
|
| 94 | - 'FHEE__EE_Gateway___line_item_desc', |
|
| 95 | - $line_item->desc(), |
|
| 96 | - $this, |
|
| 97 | - $line_item, |
|
| 98 | - $payment |
|
| 99 | - ); |
|
| 100 | - } |
|
| 101 | - |
|
| 102 | - |
|
| 103 | - |
|
| 104 | - /** |
|
| 105 | - * Gets the order description that should generally be sent to gateways |
|
| 106 | - * |
|
| 107 | - * @param \EEI_Payment $payment |
|
| 108 | - * @return string |
|
| 109 | - */ |
|
| 110 | - public function formatOrderDescription(\EEI_Payment $payment) |
|
| 111 | - { |
|
| 112 | - return apply_filters( |
|
| 113 | - 'FHEE__EE_Gateway___order_description', |
|
| 114 | - sprintf( |
|
| 115 | - __('Event Registrations from %1$s for %2$s', "event_espresso"), |
|
| 116 | - get_bloginfo('name'), |
|
| 117 | - $payment->get_first_event_name() |
|
| 118 | - ), |
|
| 119 | - $this, |
|
| 120 | - $payment |
|
| 121 | - ); |
|
| 122 | - } |
|
| 123 | - |
|
| 124 | - |
|
| 125 | - |
|
| 126 | - /** |
|
| 127 | - * Formats the amount so it can generally be sent to gateways |
|
| 128 | - * |
|
| 129 | - * @param float $amount |
|
| 130 | - * @return string |
|
| 131 | - */ |
|
| 132 | - public function formatCurrency($amount) |
|
| 133 | - { |
|
| 134 | - return number_format($amount, 2, '.', ''); |
|
| 135 | - } |
|
| 20 | + /** |
|
| 21 | + * Gets the text to use for a gateway's line item name when this is a partial payment |
|
| 22 | + * |
|
| 23 | + * @param \EEI_Payment $payment |
|
| 24 | + * @return string |
|
| 25 | + */ |
|
| 26 | + public function formatPartialPaymentLineItemName(\EEI_Payment $payment) |
|
| 27 | + { |
|
| 28 | + return apply_filters( |
|
| 29 | + 'EEG_Paypal_Pro__do_direct_payment__partial_amount_line_item_name', |
|
| 30 | + $payment->get_first_event_name(), |
|
| 31 | + $this, |
|
| 32 | + $payment |
|
| 33 | + ); |
|
| 34 | + } |
|
| 35 | + |
|
| 36 | + |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * Gets the text to use for a gateway's line item description when this is a partial payment |
|
| 40 | + * |
|
| 41 | + * @param \EEI_Payment $payment |
|
| 42 | + * @return string |
|
| 43 | + */ |
|
| 44 | + public function formatPartialPaymentLineItemDesc(\EEI_Payment $payment) |
|
| 45 | + { |
|
| 46 | + return apply_filters( |
|
| 47 | + 'FHEE__EE_Gateway___partial_payment_desc', |
|
| 48 | + sprintf( |
|
| 49 | + __("Payment of %s for %s", "event_espresso"), |
|
| 50 | + $payment->get_pretty('PAY_amount', 'no_currency_code'), |
|
| 51 | + $payment->get_first_event_name() |
|
| 52 | + ), |
|
| 53 | + $this, |
|
| 54 | + $payment |
|
| 55 | + ); |
|
| 56 | + } |
|
| 57 | + |
|
| 58 | + |
|
| 59 | + |
|
| 60 | + /** |
|
| 61 | + * Gets the name to use for a line item when sending line items to the gateway |
|
| 62 | + * |
|
| 63 | + * @param \EEI_Line_Item $line_item |
|
| 64 | + * @param \EEI_Payment $payment |
|
| 65 | + * @return string |
|
| 66 | + */ |
|
| 67 | + public function formatLineItemName(\EEI_Line_Item $line_item, \EEI_Payment $payment) |
|
| 68 | + { |
|
| 69 | + return apply_filters( |
|
| 70 | + 'FHEE__EE_gateway___line_item_name', |
|
| 71 | + sprintf( |
|
| 72 | + _x('%1$s for %2$s', 'Ticket for Event', 'event_espresso'), |
|
| 73 | + $line_item->name(), |
|
| 74 | + $line_item->ticket_event_name() |
|
| 75 | + ), |
|
| 76 | + $this, |
|
| 77 | + $line_item, |
|
| 78 | + $payment |
|
| 79 | + ); |
|
| 80 | + } |
|
| 81 | + |
|
| 82 | + |
|
| 83 | + |
|
| 84 | + /** |
|
| 85 | + * Gets the description to use for a line item when sending line items to the gateway |
|
| 86 | + * |
|
| 87 | + * @param \EEI_Line_Item $line_item |
|
| 88 | + * @param \EEI_Payment $payment |
|
| 89 | + * @return string |
|
| 90 | + */ |
|
| 91 | + public function formatLineItemDesc(\EEI_Line_Item $line_item, \EEI_Payment $payment) |
|
| 92 | + { |
|
| 93 | + return apply_filters( |
|
| 94 | + 'FHEE__EE_Gateway___line_item_desc', |
|
| 95 | + $line_item->desc(), |
|
| 96 | + $this, |
|
| 97 | + $line_item, |
|
| 98 | + $payment |
|
| 99 | + ); |
|
| 100 | + } |
|
| 101 | + |
|
| 102 | + |
|
| 103 | + |
|
| 104 | + /** |
|
| 105 | + * Gets the order description that should generally be sent to gateways |
|
| 106 | + * |
|
| 107 | + * @param \EEI_Payment $payment |
|
| 108 | + * @return string |
|
| 109 | + */ |
|
| 110 | + public function formatOrderDescription(\EEI_Payment $payment) |
|
| 111 | + { |
|
| 112 | + return apply_filters( |
|
| 113 | + 'FHEE__EE_Gateway___order_description', |
|
| 114 | + sprintf( |
|
| 115 | + __('Event Registrations from %1$s for %2$s', "event_espresso"), |
|
| 116 | + get_bloginfo('name'), |
|
| 117 | + $payment->get_first_event_name() |
|
| 118 | + ), |
|
| 119 | + $this, |
|
| 120 | + $payment |
|
| 121 | + ); |
|
| 122 | + } |
|
| 123 | + |
|
| 124 | + |
|
| 125 | + |
|
| 126 | + /** |
|
| 127 | + * Formats the amount so it can generally be sent to gateways |
|
| 128 | + * |
|
| 129 | + * @param float $amount |
|
| 130 | + * @return string |
|
| 131 | + */ |
|
| 132 | + public function formatCurrency($amount) |
|
| 133 | + { |
|
| 134 | + return number_format($amount, 2, '.', ''); |
|
| 135 | + } |
|
| 136 | 136 | } |
| 137 | 137 | // End of file GatewayDataFormatter.php |
| 138 | 138 | // Location: core\services\gateways/GatewayDataFormatter.php |
| 139 | 139 | \ No newline at end of file |
@@ -16,65 +16,65 @@ |
||
| 16 | 16 | interface GatewayDataFormatterInterface |
| 17 | 17 | { |
| 18 | 18 | |
| 19 | - /** |
|
| 20 | - * Gets the text to use for a gateway's line item name when this is a partial payment |
|
| 21 | - * |
|
| 22 | - * @param \EEI_Payment $payment |
|
| 23 | - * @return string |
|
| 24 | - */ |
|
| 25 | - public function formatPartialPaymentLineItemName(\EEI_Payment $payment); |
|
| 19 | + /** |
|
| 20 | + * Gets the text to use for a gateway's line item name when this is a partial payment |
|
| 21 | + * |
|
| 22 | + * @param \EEI_Payment $payment |
|
| 23 | + * @return string |
|
| 24 | + */ |
|
| 25 | + public function formatPartialPaymentLineItemName(\EEI_Payment $payment); |
|
| 26 | 26 | |
| 27 | 27 | |
| 28 | 28 | |
| 29 | - /** |
|
| 30 | - * Gets the text to use for a gateway's line item description when this is a partial payment |
|
| 31 | - * |
|
| 32 | - * @param \EEI_Payment $payment |
|
| 33 | - * @return string |
|
| 34 | - */ |
|
| 35 | - public function formatPartialPaymentLineItemDesc(\EEI_Payment $payment); |
|
| 29 | + /** |
|
| 30 | + * Gets the text to use for a gateway's line item description when this is a partial payment |
|
| 31 | + * |
|
| 32 | + * @param \EEI_Payment $payment |
|
| 33 | + * @return string |
|
| 34 | + */ |
|
| 35 | + public function formatPartialPaymentLineItemDesc(\EEI_Payment $payment); |
|
| 36 | 36 | |
| 37 | 37 | |
| 38 | 38 | |
| 39 | - /** |
|
| 40 | - * Gets the name to use for a line item when sending line items to the gateway |
|
| 41 | - * |
|
| 42 | - * @param \EEI_Line_Item $line_item |
|
| 43 | - * @param \EEI_Payment $payment |
|
| 44 | - * @return string |
|
| 45 | - */ |
|
| 46 | - public function formatLineItemName(\EEI_Line_Item $line_item, \EEI_Payment $payment); |
|
| 39 | + /** |
|
| 40 | + * Gets the name to use for a line item when sending line items to the gateway |
|
| 41 | + * |
|
| 42 | + * @param \EEI_Line_Item $line_item |
|
| 43 | + * @param \EEI_Payment $payment |
|
| 44 | + * @return string |
|
| 45 | + */ |
|
| 46 | + public function formatLineItemName(\EEI_Line_Item $line_item, \EEI_Payment $payment); |
|
| 47 | 47 | |
| 48 | 48 | |
| 49 | 49 | |
| 50 | - /** |
|
| 51 | - * Gets the description to use for a line item when sending line items to the gateway |
|
| 52 | - * |
|
| 53 | - * @param \EEI_Line_Item $line_item |
|
| 54 | - * @param \EEI_Payment $payment |
|
| 55 | - * @return string |
|
| 56 | - */ |
|
| 57 | - public function formatLineItemDesc(\EEI_Line_Item $line_item, \EEI_Payment $payment); |
|
| 50 | + /** |
|
| 51 | + * Gets the description to use for a line item when sending line items to the gateway |
|
| 52 | + * |
|
| 53 | + * @param \EEI_Line_Item $line_item |
|
| 54 | + * @param \EEI_Payment $payment |
|
| 55 | + * @return string |
|
| 56 | + */ |
|
| 57 | + public function formatLineItemDesc(\EEI_Line_Item $line_item, \EEI_Payment $payment); |
|
| 58 | 58 | |
| 59 | 59 | |
| 60 | 60 | |
| 61 | - /** |
|
| 62 | - * Gets the order description that should generally be sent to gateways |
|
| 63 | - * |
|
| 64 | - * @param \EEI_Payment $payment |
|
| 65 | - * @return string |
|
| 66 | - */ |
|
| 67 | - public function formatOrderDescription(\EEI_Payment $payment); |
|
| 61 | + /** |
|
| 62 | + * Gets the order description that should generally be sent to gateways |
|
| 63 | + * |
|
| 64 | + * @param \EEI_Payment $payment |
|
| 65 | + * @return string |
|
| 66 | + */ |
|
| 67 | + public function formatOrderDescription(\EEI_Payment $payment); |
|
| 68 | 68 | |
| 69 | 69 | |
| 70 | 70 | |
| 71 | - /** |
|
| 72 | - * Formats the amount so it can generally be sent to gateways |
|
| 73 | - * |
|
| 74 | - * @param float $amount |
|
| 75 | - * @return string |
|
| 76 | - */ |
|
| 77 | - public function formatCurrency($amount); |
|
| 71 | + /** |
|
| 72 | + * Formats the amount so it can generally be sent to gateways |
|
| 73 | + * |
|
| 74 | + * @param float $amount |
|
| 75 | + * @return string |
|
| 76 | + */ |
|
| 77 | + public function formatCurrency($amount); |
|
| 78 | 78 | } |
| 79 | 79 | // End of file GatewayDataFormatterInterface.php |
| 80 | 80 | // Location: core\services\payment_methods\gateways/GatewayDataFormatterInterface.php |
| 81 | 81 | \ No newline at end of file |
@@ -16,23 +16,23 @@ |
||
| 16 | 16 | interface FormatterInterface |
| 17 | 17 | { |
| 18 | 18 | |
| 19 | - /** |
|
| 20 | - * Applies the formatting to all items in the array |
|
| 21 | - * |
|
| 22 | - * @param array $input accepts a multi-dimensional array, but all "leaf nodes" are easily cast to a string |
|
| 23 | - * @return array |
|
| 24 | - */ |
|
| 25 | - public function formatArray($input); |
|
| 26 | - |
|
| 27 | - |
|
| 28 | - |
|
| 29 | - /** |
|
| 30 | - * Formats the string |
|
| 31 | - * |
|
| 32 | - * @param string|int|float $input anything easily cast into a string |
|
| 33 | - * @return string |
|
| 34 | - */ |
|
| 35 | - public function format($input); |
|
| 19 | + /** |
|
| 20 | + * Applies the formatting to all items in the array |
|
| 21 | + * |
|
| 22 | + * @param array $input accepts a multi-dimensional array, but all "leaf nodes" are easily cast to a string |
|
| 23 | + * @return array |
|
| 24 | + */ |
|
| 25 | + public function formatArray($input); |
|
| 26 | + |
|
| 27 | + |
|
| 28 | + |
|
| 29 | + /** |
|
| 30 | + * Formats the string |
|
| 31 | + * |
|
| 32 | + * @param string|int|float $input anything easily cast into a string |
|
| 33 | + * @return string |
|
| 34 | + */ |
|
| 35 | + public function format($input); |
|
| 36 | 36 | } |
| 37 | 37 | // End of file FormatterInterface.php |
| 38 | 38 | // Location: core\services\formatters/FormatterInterface.php |
| 39 | 39 | \ No newline at end of file |
@@ -921,7 +921,7 @@ discard block |
||
| 921 | 921 | /** |
| 922 | 922 | * Sets deleted |
| 923 | 923 | * @param boolean $deleted |
| 924 | - * @return boolean |
|
| 924 | + * @return boolean|null |
|
| 925 | 925 | */ |
| 926 | 926 | public function set_deleted($deleted) { |
| 927 | 927 | if ( $deleted ) { |
@@ -969,6 +969,7 @@ discard block |
||
| 969 | 969 | * |
| 970 | 970 | * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against |
| 971 | 971 | * @param bool $check_approved This is used to indicate whether the caller wants can_checkin to also consider registration status as well as datetime access. |
| 972 | + * @param integer $DTT_OR_ID |
|
| 972 | 973 | * |
| 973 | 974 | * @return bool |
| 974 | 975 | */ |
@@ -1107,7 +1108,7 @@ discard block |
||
| 1107 | 1108 | * Returns the latest datetime related to this registration (via the ticket attached to the registration). |
| 1108 | 1109 | * "Latest" is defined by the `DTT_EVT_start` column. |
| 1109 | 1110 | * |
| 1110 | - * @return EE_Datetime|null |
|
| 1111 | + * @return null|EE_Base_Class |
|
| 1111 | 1112 | * @throws \EE_Error |
| 1112 | 1113 | */ |
| 1113 | 1114 | public function get_latest_related_datetime() { |
@@ -1378,7 +1379,7 @@ discard block |
||
| 1378 | 1379 | * This grabs the payment method corresponding to the last payment made for the amount owing on the registration. |
| 1379 | 1380 | * Note: if there are no payments on the registration there will be no payment method returned. |
| 1380 | 1381 | * |
| 1381 | - * @return EE_Payment_Method|null |
|
| 1382 | + * @return null|EE_Base_Class |
|
| 1382 | 1383 | */ |
| 1383 | 1384 | public function payment_method() { |
| 1384 | 1385 | return EEM_Payment_Method::instance()->get_last_used_for_registration( $this ); |
@@ -35,7 +35,7 @@ discard block |
||
| 35 | 35 | |
| 36 | 36 | /** |
| 37 | 37 | * extra meta key for tracking reg status os trashed registrations |
| 38 | - * |
|
| 38 | + * |
|
| 39 | 39 | * @type string |
| 40 | 40 | */ |
| 41 | 41 | const PRE_TRASH_REG_STATUS_KEY = 'pre_trash_registration_status'; |
@@ -43,7 +43,7 @@ discard block |
||
| 43 | 43 | |
| 44 | 44 | /** |
| 45 | 45 | * extra meta key for tracking if registration has reserved ticket |
| 46 | - * |
|
| 46 | + * |
|
| 47 | 47 | * @type string |
| 48 | 48 | */ |
| 49 | 49 | const HAS_RESERVED_TICKET_KEY = 'has_reserved_ticket'; |
@@ -89,15 +89,15 @@ discard block |
||
| 89 | 89 | |
| 90 | 90 | |
| 91 | 91 | |
| 92 | - /** |
|
| 93 | - * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can be routed to internal methods |
|
| 94 | - * |
|
| 95 | - * @param string $field_name |
|
| 96 | - * @param mixed $field_value |
|
| 97 | - * @param bool $use_default |
|
| 98 | - * @throws \EE_Error |
|
| 99 | - * @throws \RuntimeException |
|
| 100 | - */ |
|
| 92 | + /** |
|
| 93 | + * Overrides parent set() method so that all calls to set( 'REG_code', $REG_code ) OR set( 'STS_ID', $STS_ID ) can be routed to internal methods |
|
| 94 | + * |
|
| 95 | + * @param string $field_name |
|
| 96 | + * @param mixed $field_value |
|
| 97 | + * @param bool $use_default |
|
| 98 | + * @throws \EE_Error |
|
| 99 | + * @throws \RuntimeException |
|
| 100 | + */ |
|
| 101 | 101 | public function set( $field_name, $field_value, $use_default = FALSE ) { |
| 102 | 102 | switch( $field_name ) { |
| 103 | 103 | case 'REG_code' : |
@@ -115,18 +115,18 @@ discard block |
||
| 115 | 115 | |
| 116 | 116 | |
| 117 | 117 | |
| 118 | - /** |
|
| 119 | - * Set Status ID |
|
| 120 | - * updates the registration status and ALSO... |
|
| 121 | - * calls reserve_registration_space() if the reg status changes TO approved from any other reg status |
|
| 122 | - * calls release_registration_space() if the reg status changes FROM approved to any other reg status |
|
| 123 | - * |
|
| 124 | - * @param string $new_STS_ID |
|
| 125 | - * @param boolean $use_default |
|
| 126 | - * @return bool |
|
| 127 | - * @throws \RuntimeException |
|
| 128 | - * @throws \EE_Error |
|
| 129 | - */ |
|
| 118 | + /** |
|
| 119 | + * Set Status ID |
|
| 120 | + * updates the registration status and ALSO... |
|
| 121 | + * calls reserve_registration_space() if the reg status changes TO approved from any other reg status |
|
| 122 | + * calls release_registration_space() if the reg status changes FROM approved to any other reg status |
|
| 123 | + * |
|
| 124 | + * @param string $new_STS_ID |
|
| 125 | + * @param boolean $use_default |
|
| 126 | + * @return bool |
|
| 127 | + * @throws \RuntimeException |
|
| 128 | + * @throws \EE_Error |
|
| 129 | + */ |
|
| 130 | 130 | public function set_status( $new_STS_ID = NULL, $use_default = FALSE ) { |
| 131 | 131 | // get current REG_Status |
| 132 | 132 | $old_STS_ID = $this->status_ID(); |
@@ -137,7 +137,7 @@ discard block |
||
| 137 | 137 | && ! empty( $new_STS_ID ) // as well as the new status |
| 138 | 138 | && $this->ID() // ensure registration is in the db |
| 139 | 139 | ) { |
| 140 | - // TO approved |
|
| 140 | + // TO approved |
|
| 141 | 141 | if ( $new_STS_ID === EEM_Registration::status_id_approved ) { |
| 142 | 142 | // reserve a space by incrementing ticket and datetime sold values |
| 143 | 143 | $this->_reserve_registration_space(); |
@@ -148,12 +148,12 @@ discard block |
||
| 148 | 148 | $this->_release_registration_space(); |
| 149 | 149 | do_action( 'AHEE__EE_Registration__set_status__from_approved', $this, $old_STS_ID, $new_STS_ID ); |
| 150 | 150 | } |
| 151 | - // update status |
|
| 152 | - parent::set('STS_ID', $new_STS_ID, $use_default); |
|
| 153 | - $this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID); |
|
| 154 | - /** @type EE_Transaction_Payments $transaction_payments */ |
|
| 155 | - $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments'); |
|
| 156 | - $transaction_payments->recalculate_transaction_total( $this->transaction(), false ); |
|
| 151 | + // update status |
|
| 152 | + parent::set('STS_ID', $new_STS_ID, $use_default); |
|
| 153 | + $this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID); |
|
| 154 | + /** @type EE_Transaction_Payments $transaction_payments */ |
|
| 155 | + $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments'); |
|
| 156 | + $transaction_payments->recalculate_transaction_total( $this->transaction(), false ); |
|
| 157 | 157 | $this->transaction()->update_status_based_on_total_paid( true ); |
| 158 | 158 | do_action( 'AHEE__EE_Registration__set_status__after_update', $this ); |
| 159 | 159 | return TRUE; |
@@ -167,60 +167,60 @@ discard block |
||
| 167 | 167 | |
| 168 | 168 | |
| 169 | 169 | |
| 170 | - /** |
|
| 171 | - * update REGs and TXN when cancelled or declined registrations involved |
|
| 172 | - * |
|
| 173 | - * @param string $new_STS_ID |
|
| 174 | - * @param string $old_STS_ID |
|
| 175 | - * @throws \EE_Error |
|
| 176 | - */ |
|
| 177 | - private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID) |
|
| 178 | - { |
|
| 179 | - // these reg statuses should not be considered in any calculations involving monies owing |
|
| 180 | - $closed_reg_statuses = EEM_Registration::closed_reg_statuses(); |
|
| 181 | - // true if registration has been cancelled or declined |
|
| 182 | - if ( |
|
| 183 | - in_array($new_STS_ID, $closed_reg_statuses, true) |
|
| 184 | - && ! in_array($old_STS_ID, $closed_reg_statuses, true) |
|
| 185 | - ) { |
|
| 186 | - /** @type EE_Registration_Processor $registration_processor */ |
|
| 187 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
| 188 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
| 189 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
| 190 | - // cancelled or declined registration |
|
| 191 | - $registration_processor->update_registration_after_being_canceled_or_declined( |
|
| 192 | - $this, |
|
| 193 | - $closed_reg_statuses |
|
| 194 | - ); |
|
| 195 | - $transaction_processor->update_transaction_after_canceled_or_declined_registration( |
|
| 196 | - $this, |
|
| 197 | - $closed_reg_statuses, |
|
| 198 | - false |
|
| 199 | - ); |
|
| 200 | - do_action('AHEE__EE_Registration__set_status__canceled_or_declined', $this, $old_STS_ID, $new_STS_ID); |
|
| 201 | - return; |
|
| 202 | - } |
|
| 203 | - // true if reinstating cancelled or declined registration |
|
| 204 | - if ( |
|
| 205 | - in_array($old_STS_ID, $closed_reg_statuses, true) |
|
| 206 | - && ! in_array($new_STS_ID, $closed_reg_statuses, true) |
|
| 207 | - ) { |
|
| 208 | - /** @type EE_Registration_Processor $registration_processor */ |
|
| 209 | - $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
| 210 | - /** @type EE_Transaction_Processor $transaction_processor */ |
|
| 211 | - $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
| 212 | - // reinstating cancelled or declined registration |
|
| 213 | - $registration_processor->update_canceled_or_declined_registration_after_being_reinstated( |
|
| 214 | - $this, |
|
| 215 | - $closed_reg_statuses |
|
| 216 | - ); |
|
| 217 | - $transaction_processor->update_transaction_after_reinstating_canceled_registration( |
|
| 218 | - $this, |
|
| 219 | - $closed_reg_statuses, |
|
| 220 | - false |
|
| 221 | - ); |
|
| 222 | - do_action('AHEE__EE_Registration__set_status__after_reinstated', $this, $old_STS_ID, $new_STS_ID); |
|
| 223 | - } |
|
| 170 | + /** |
|
| 171 | + * update REGs and TXN when cancelled or declined registrations involved |
|
| 172 | + * |
|
| 173 | + * @param string $new_STS_ID |
|
| 174 | + * @param string $old_STS_ID |
|
| 175 | + * @throws \EE_Error |
|
| 176 | + */ |
|
| 177 | + private function _update_if_canceled_or_declined($new_STS_ID, $old_STS_ID) |
|
| 178 | + { |
|
| 179 | + // these reg statuses should not be considered in any calculations involving monies owing |
|
| 180 | + $closed_reg_statuses = EEM_Registration::closed_reg_statuses(); |
|
| 181 | + // true if registration has been cancelled or declined |
|
| 182 | + if ( |
|
| 183 | + in_array($new_STS_ID, $closed_reg_statuses, true) |
|
| 184 | + && ! in_array($old_STS_ID, $closed_reg_statuses, true) |
|
| 185 | + ) { |
|
| 186 | + /** @type EE_Registration_Processor $registration_processor */ |
|
| 187 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
| 188 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
| 189 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
| 190 | + // cancelled or declined registration |
|
| 191 | + $registration_processor->update_registration_after_being_canceled_or_declined( |
|
| 192 | + $this, |
|
| 193 | + $closed_reg_statuses |
|
| 194 | + ); |
|
| 195 | + $transaction_processor->update_transaction_after_canceled_or_declined_registration( |
|
| 196 | + $this, |
|
| 197 | + $closed_reg_statuses, |
|
| 198 | + false |
|
| 199 | + ); |
|
| 200 | + do_action('AHEE__EE_Registration__set_status__canceled_or_declined', $this, $old_STS_ID, $new_STS_ID); |
|
| 201 | + return; |
|
| 202 | + } |
|
| 203 | + // true if reinstating cancelled or declined registration |
|
| 204 | + if ( |
|
| 205 | + in_array($old_STS_ID, $closed_reg_statuses, true) |
|
| 206 | + && ! in_array($new_STS_ID, $closed_reg_statuses, true) |
|
| 207 | + ) { |
|
| 208 | + /** @type EE_Registration_Processor $registration_processor */ |
|
| 209 | + $registration_processor = EE_Registry::instance()->load_class('Registration_Processor'); |
|
| 210 | + /** @type EE_Transaction_Processor $transaction_processor */ |
|
| 211 | + $transaction_processor = EE_Registry::instance()->load_class('Transaction_Processor'); |
|
| 212 | + // reinstating cancelled or declined registration |
|
| 213 | + $registration_processor->update_canceled_or_declined_registration_after_being_reinstated( |
|
| 214 | + $this, |
|
| 215 | + $closed_reg_statuses |
|
| 216 | + ); |
|
| 217 | + $transaction_processor->update_transaction_after_reinstating_canceled_registration( |
|
| 218 | + $this, |
|
| 219 | + $closed_reg_statuses, |
|
| 220 | + false |
|
| 221 | + ); |
|
| 222 | + do_action('AHEE__EE_Registration__set_status__after_reinstated', $this, $old_STS_ID, $new_STS_ID); |
|
| 223 | + } |
|
| 224 | 224 | } |
| 225 | 225 | |
| 226 | 226 | |
@@ -233,16 +233,16 @@ discard block |
||
| 233 | 233 | |
| 234 | 234 | |
| 235 | 235 | |
| 236 | - /** |
|
| 237 | - * increments this registration's related ticket sold and corresponding datetime sold values |
|
| 238 | - * |
|
| 239 | - * @return void |
|
| 240 | - * @throws \EE_Error |
|
| 241 | - */ |
|
| 236 | + /** |
|
| 237 | + * increments this registration's related ticket sold and corresponding datetime sold values |
|
| 238 | + * |
|
| 239 | + * @return void |
|
| 240 | + * @throws \EE_Error |
|
| 241 | + */ |
|
| 242 | 242 | private function _reserve_registration_space() { |
| 243 | - // reserved ticket and datetime counts will be decremented as sold counts are incremented |
|
| 244 | - // so stop tracking that this reg has a ticket reserved |
|
| 245 | - $this->release_reserved_ticket(); |
|
| 243 | + // reserved ticket and datetime counts will be decremented as sold counts are incremented |
|
| 244 | + // so stop tracking that this reg has a ticket reserved |
|
| 245 | + $this->release_reserved_ticket(); |
|
| 246 | 246 | $ticket = $this->ticket(); |
| 247 | 247 | $ticket->increase_sold(); |
| 248 | 248 | $ticket->save(); |
@@ -252,13 +252,13 @@ discard block |
||
| 252 | 252 | |
| 253 | 253 | |
| 254 | 254 | |
| 255 | - /** |
|
| 256 | - * Gets the ticket this registration is for |
|
| 257 | - * |
|
| 258 | - * @param boolean $include_archived whether to include archived tickets or not. |
|
| 259 | - * @return EE_Ticket|EE_Base_Class |
|
| 260 | - * @throws \EE_Error |
|
| 261 | - */ |
|
| 255 | + /** |
|
| 256 | + * Gets the ticket this registration is for |
|
| 257 | + * |
|
| 258 | + * @param boolean $include_archived whether to include archived tickets or not. |
|
| 259 | + * @return EE_Ticket|EE_Base_Class |
|
| 260 | + * @throws \EE_Error |
|
| 261 | + */ |
|
| 262 | 262 | public function ticket( $include_archived = TRUE ) { |
| 263 | 263 | $query_params = array(); |
| 264 | 264 | if ( $include_archived ) { |
@@ -300,12 +300,12 @@ discard block |
||
| 300 | 300 | |
| 301 | 301 | |
| 302 | 302 | |
| 303 | - /** |
|
| 304 | - * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values |
|
| 305 | - * |
|
| 306 | - * @return void |
|
| 307 | - * @throws \EE_Error |
|
| 308 | - */ |
|
| 303 | + /** |
|
| 304 | + * decrements (subtracts) this registration's related ticket sold and corresponding datetime sold values |
|
| 305 | + * |
|
| 306 | + * @return void |
|
| 307 | + * @throws \EE_Error |
|
| 308 | + */ |
|
| 309 | 309 | private function _release_registration_space() { |
| 310 | 310 | $ticket = $this->ticket(); |
| 311 | 311 | $ticket->decrease_sold(); |
@@ -314,46 +314,46 @@ discard block |
||
| 314 | 314 | |
| 315 | 315 | |
| 316 | 316 | |
| 317 | - /** |
|
| 318 | - * tracks this registration's ticket reservation in extra meta |
|
| 319 | - * and can increment related ticket reserved and corresponding datetime reserved values |
|
| 320 | - * |
|
| 321 | - * @param bool $update_ticket if true, will increment ticket and datetime reserved count |
|
| 322 | - * @return void |
|
| 323 | - * @throws \EE_Error |
|
| 324 | - */ |
|
| 317 | + /** |
|
| 318 | + * tracks this registration's ticket reservation in extra meta |
|
| 319 | + * and can increment related ticket reserved and corresponding datetime reserved values |
|
| 320 | + * |
|
| 321 | + * @param bool $update_ticket if true, will increment ticket and datetime reserved count |
|
| 322 | + * @return void |
|
| 323 | + * @throws \EE_Error |
|
| 324 | + */ |
|
| 325 | 325 | public function reserve_ticket($update_ticket = false) { |
| 326 | - if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) === false) { |
|
| 327 | - // PLZ NOTE: although checking $update_ticket first would be more efficient, |
|
| 328 | - // we NEED to ALWAYS call update_extra_meta(), which is why that is done first |
|
| 329 | - if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) && $update_ticket) { |
|
| 330 | - $ticket = $this->ticket(); |
|
| 331 | - $ticket->increase_reserved(); |
|
| 332 | - $ticket->save(); |
|
| 333 | - } |
|
| 334 | - } |
|
| 326 | + if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) === false) { |
|
| 327 | + // PLZ NOTE: although checking $update_ticket first would be more efficient, |
|
| 328 | + // we NEED to ALWAYS call update_extra_meta(), which is why that is done first |
|
| 329 | + if ($this->update_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) && $update_ticket) { |
|
| 330 | + $ticket = $this->ticket(); |
|
| 331 | + $ticket->increase_reserved(); |
|
| 332 | + $ticket->save(); |
|
| 333 | + } |
|
| 334 | + } |
|
| 335 | 335 | } |
| 336 | 336 | |
| 337 | 337 | |
| 338 | 338 | |
| 339 | - /** |
|
| 340 | - * stops tracking this registration's ticket reservation in extra meta |
|
| 341 | - * decrements (subtracts) related ticket reserved and corresponding datetime reserved values |
|
| 342 | - * |
|
| 343 | - * @param bool $update_ticket if true, will decrement ticket and datetime reserved count |
|
| 344 | - * @return void |
|
| 345 | - * @throws \EE_Error |
|
| 346 | - */ |
|
| 347 | - public function release_reserved_ticket($update_ticket = false) { |
|
| 348 | - if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) !== false) { |
|
| 349 | - // PLZ NOTE: although checking $update_ticket first would be more efficient, |
|
| 350 | - // we NEED to ALWAYS call delete_extra_meta(), which is why that is done first |
|
| 351 | - if ($this->delete_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY) && $update_ticket) { |
|
| 352 | - $ticket = $this->ticket(); |
|
| 353 | - $ticket->decrease_reserved(); |
|
| 354 | - $ticket->save(); |
|
| 355 | - } |
|
| 356 | - } |
|
| 339 | + /** |
|
| 340 | + * stops tracking this registration's ticket reservation in extra meta |
|
| 341 | + * decrements (subtracts) related ticket reserved and corresponding datetime reserved values |
|
| 342 | + * |
|
| 343 | + * @param bool $update_ticket if true, will decrement ticket and datetime reserved count |
|
| 344 | + * @return void |
|
| 345 | + * @throws \EE_Error |
|
| 346 | + */ |
|
| 347 | + public function release_reserved_ticket($update_ticket = false) { |
|
| 348 | + if ($this->get_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY, true, false) !== false) { |
|
| 349 | + // PLZ NOTE: although checking $update_ticket first would be more efficient, |
|
| 350 | + // we NEED to ALWAYS call delete_extra_meta(), which is why that is done first |
|
| 351 | + if ($this->delete_extra_meta(EE_Registration::HAS_RESERVED_TICKET_KEY) && $update_ticket) { |
|
| 352 | + $ticket = $this->ticket(); |
|
| 353 | + $ticket->decrease_reserved(); |
|
| 354 | + $ticket->save(); |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | 357 | } |
| 358 | 358 | |
| 359 | 359 | |
@@ -742,9 +742,9 @@ discard block |
||
| 742 | 742 | |
| 743 | 743 | |
| 744 | 744 | /** |
| 745 | - * get Attendee Number |
|
| 746 | - * @access public |
|
| 747 | - */ |
|
| 745 | + * get Attendee Number |
|
| 746 | + * @access public |
|
| 747 | + */ |
|
| 748 | 748 | public function count() { |
| 749 | 749 | return $this->get( 'REG_count' ); |
| 750 | 750 | } |
@@ -1021,11 +1021,11 @@ discard block |
||
| 1021 | 1021 | * @return boolean |
| 1022 | 1022 | */ |
| 1023 | 1023 | public function set_deleted($deleted) { |
| 1024 | - if ( $deleted ) { |
|
| 1025 | - $this->delete(); |
|
| 1026 | - } else { |
|
| 1027 | - $this->restore(); |
|
| 1028 | - } |
|
| 1024 | + if ( $deleted ) { |
|
| 1025 | + $this->delete(); |
|
| 1026 | + } else { |
|
| 1027 | + $this->restore(); |
|
| 1028 | + } |
|
| 1029 | 1029 | } |
| 1030 | 1030 | |
| 1031 | 1031 | |
@@ -1130,20 +1130,20 @@ discard block |
||
| 1130 | 1130 | |
| 1131 | 1131 | |
| 1132 | 1132 | |
| 1133 | - /** |
|
| 1134 | - * toggle Check-in status for this registration |
|
| 1135 | - * Check-ins are toggled in the following order: |
|
| 1136 | - * never checked in -> checked in |
|
| 1137 | - * checked in -> checked out |
|
| 1138 | - * checked out -> checked in |
|
| 1139 | - * |
|
| 1140 | - * @param int $DTT_ID include specific datetime to toggle Check-in for. |
|
| 1141 | - * If not included or null, then it is assumed latest datetime is being toggled. |
|
| 1142 | - * @param bool $verify If true then can_checkin() is used to verify whether the person |
|
| 1143 | - * can be checked in or not. Otherwise this forces change in checkin status. |
|
| 1144 | - * @return bool|int the chk_in status toggled to OR false if nothing got changed. |
|
| 1145 | - * @throws EE_Error |
|
| 1146 | - */ |
|
| 1133 | + /** |
|
| 1134 | + * toggle Check-in status for this registration |
|
| 1135 | + * Check-ins are toggled in the following order: |
|
| 1136 | + * never checked in -> checked in |
|
| 1137 | + * checked in -> checked out |
|
| 1138 | + * checked out -> checked in |
|
| 1139 | + * |
|
| 1140 | + * @param int $DTT_ID include specific datetime to toggle Check-in for. |
|
| 1141 | + * If not included or null, then it is assumed latest datetime is being toggled. |
|
| 1142 | + * @param bool $verify If true then can_checkin() is used to verify whether the person |
|
| 1143 | + * can be checked in or not. Otherwise this forces change in checkin status. |
|
| 1144 | + * @return bool|int the chk_in status toggled to OR false if nothing got changed. |
|
| 1145 | + * @throws EE_Error |
|
| 1146 | + */ |
|
| 1147 | 1147 | public function toggle_checkin_status( $DTT_ID = null, $verify = false ) { |
| 1148 | 1148 | if ( empty( $DTT_ID ) ) { |
| 1149 | 1149 | $datetime = $this->get_latest_related_datetime(); |
@@ -1200,13 +1200,13 @@ discard block |
||
| 1200 | 1200 | |
| 1201 | 1201 | |
| 1202 | 1202 | |
| 1203 | - /** |
|
| 1204 | - * Returns the latest datetime related to this registration (via the ticket attached to the registration). |
|
| 1205 | - * "Latest" is defined by the `DTT_EVT_start` column. |
|
| 1206 | - * |
|
| 1207 | - * @return EE_Datetime|null |
|
| 1208 | - * @throws \EE_Error |
|
| 1209 | - */ |
|
| 1203 | + /** |
|
| 1204 | + * Returns the latest datetime related to this registration (via the ticket attached to the registration). |
|
| 1205 | + * "Latest" is defined by the `DTT_EVT_start` column. |
|
| 1206 | + * |
|
| 1207 | + * @return EE_Datetime|null |
|
| 1208 | + * @throws \EE_Error |
|
| 1209 | + */ |
|
| 1210 | 1210 | public function get_latest_related_datetime() { |
| 1211 | 1211 | return EEM_Datetime::instance()->get_one( |
| 1212 | 1212 | array( |
@@ -1220,12 +1220,12 @@ discard block |
||
| 1220 | 1220 | |
| 1221 | 1221 | |
| 1222 | 1222 | |
| 1223 | - /** |
|
| 1224 | - * Returns the earliest datetime related to this registration (via the ticket attached to the registration). |
|
| 1225 | - * "Earliest" is defined by the `DTT_EVT_start` column. |
|
| 1226 | - * |
|
| 1227 | - * @throws \EE_Error |
|
| 1228 | - */ |
|
| 1223 | + /** |
|
| 1224 | + * Returns the earliest datetime related to this registration (via the ticket attached to the registration). |
|
| 1225 | + * "Earliest" is defined by the `DTT_EVT_start` column. |
|
| 1226 | + * |
|
| 1227 | + * @throws \EE_Error |
|
| 1228 | + */ |
|
| 1229 | 1229 | public function get_earliest_related_datetime() { |
| 1230 | 1230 | return EEM_Datetime::instance()->get_one( |
| 1231 | 1231 | array( |
@@ -1239,18 +1239,18 @@ discard block |
||
| 1239 | 1239 | |
| 1240 | 1240 | |
| 1241 | 1241 | |
| 1242 | - /** |
|
| 1243 | - * This method simply returns the check-in status for this registration and the given datetime. |
|
| 1244 | - * If neither the datetime nor the checkin values are provided as arguments, |
|
| 1245 | - * then this will return the LATEST check-in status for the registration across all datetimes it belongs to. |
|
| 1246 | - * |
|
| 1247 | - * @param int $DTT_ID The ID of the datetime we're checking against |
|
| 1248 | - * (if empty we'll get the primary datetime for |
|
| 1249 | - * this registration (via event) and use it's ID); |
|
| 1250 | - * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id. |
|
| 1251 | - * @return int Integer representing Check-in status. |
|
| 1252 | - * @throws \EE_Error |
|
| 1253 | - */ |
|
| 1242 | + /** |
|
| 1243 | + * This method simply returns the check-in status for this registration and the given datetime. |
|
| 1244 | + * If neither the datetime nor the checkin values are provided as arguments, |
|
| 1245 | + * then this will return the LATEST check-in status for the registration across all datetimes it belongs to. |
|
| 1246 | + * |
|
| 1247 | + * @param int $DTT_ID The ID of the datetime we're checking against |
|
| 1248 | + * (if empty we'll get the primary datetime for |
|
| 1249 | + * this registration (via event) and use it's ID); |
|
| 1250 | + * @param EE_Checkin $checkin If present, we use the given checkin object rather than the dtt_id. |
|
| 1251 | + * @return int Integer representing Check-in status. |
|
| 1252 | + * @throws \EE_Error |
|
| 1253 | + */ |
|
| 1254 | 1254 | public function check_in_status_for_datetime( $DTT_ID = 0, $checkin = null ) { |
| 1255 | 1255 | $checkin_query_params = array( |
| 1256 | 1256 | 'order_by' => array( 'CHK_timestamp' => 'DESC' ) |
@@ -1262,8 +1262,8 @@ discard block |
||
| 1262 | 1262 | |
| 1263 | 1263 | //get checkin object (if exists) |
| 1264 | 1264 | $checkin = $checkin instanceof EE_Checkin |
| 1265 | - ? $checkin |
|
| 1266 | - : $this->get_first_related( 'Checkin', $checkin_query_params ); |
|
| 1265 | + ? $checkin |
|
| 1266 | + : $this->get_first_related( 'Checkin', $checkin_query_params ); |
|
| 1267 | 1267 | if ( $checkin instanceof EE_Checkin ) { |
| 1268 | 1268 | if ( $checkin->get( 'CHK_in' ) ) { |
| 1269 | 1269 | return EE_Registration::checkin_status_in; //checked in |
@@ -1516,46 +1516,46 @@ discard block |
||
| 1516 | 1516 | |
| 1517 | 1517 | |
| 1518 | 1518 | |
| 1519 | - /** |
|
| 1520 | - * Soft Deletes this model object. |
|
| 1521 | - * |
|
| 1522 | - * @return boolean | int |
|
| 1523 | - * @throws \RuntimeException |
|
| 1524 | - * @throws \EE_Error |
|
| 1525 | - */ |
|
| 1526 | - public function delete() |
|
| 1527 | - { |
|
| 1528 | - if($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) { |
|
| 1529 | - $this->set_status(EEM_Registration::status_id_cancelled); |
|
| 1530 | - } |
|
| 1531 | - return parent::delete(); |
|
| 1532 | - } |
|
| 1519 | + /** |
|
| 1520 | + * Soft Deletes this model object. |
|
| 1521 | + * |
|
| 1522 | + * @return boolean | int |
|
| 1523 | + * @throws \RuntimeException |
|
| 1524 | + * @throws \EE_Error |
|
| 1525 | + */ |
|
| 1526 | + public function delete() |
|
| 1527 | + { |
|
| 1528 | + if($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) { |
|
| 1529 | + $this->set_status(EEM_Registration::status_id_cancelled); |
|
| 1530 | + } |
|
| 1531 | + return parent::delete(); |
|
| 1532 | + } |
|
| 1533 | 1533 | |
| 1534 | 1534 | |
| 1535 | 1535 | |
| 1536 | - /** |
|
| 1537 | - * Restores whatever the previous status was on a registration before it was trashed (if possible) |
|
| 1538 | - * |
|
| 1539 | - * @throws \EE_Error |
|
| 1540 | - * @throws \RuntimeException |
|
| 1541 | - */ |
|
| 1542 | - public function restore() |
|
| 1543 | - { |
|
| 1544 | - $previous_status = $this->get_extra_meta( |
|
| 1545 | - EE_Registration::PRE_TRASH_REG_STATUS_KEY, |
|
| 1546 | - true, |
|
| 1547 | - EEM_Registration::status_id_cancelled |
|
| 1548 | - ); |
|
| 1549 | - if ($previous_status) { |
|
| 1550 | - $this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY); |
|
| 1551 | - $this->set_status($previous_status); |
|
| 1552 | - } |
|
| 1553 | - return parent::restore(); |
|
| 1554 | - } |
|
| 1536 | + /** |
|
| 1537 | + * Restores whatever the previous status was on a registration before it was trashed (if possible) |
|
| 1538 | + * |
|
| 1539 | + * @throws \EE_Error |
|
| 1540 | + * @throws \RuntimeException |
|
| 1541 | + */ |
|
| 1542 | + public function restore() |
|
| 1543 | + { |
|
| 1544 | + $previous_status = $this->get_extra_meta( |
|
| 1545 | + EE_Registration::PRE_TRASH_REG_STATUS_KEY, |
|
| 1546 | + true, |
|
| 1547 | + EEM_Registration::status_id_cancelled |
|
| 1548 | + ); |
|
| 1549 | + if ($previous_status) { |
|
| 1550 | + $this->delete_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY); |
|
| 1551 | + $this->set_status($previous_status); |
|
| 1552 | + } |
|
| 1553 | + return parent::restore(); |
|
| 1554 | + } |
|
| 1555 | 1555 | |
| 1556 | 1556 | |
| 1557 | 1557 | |
| 1558 | - /*************************** DEPRECATED ***************************/ |
|
| 1558 | + /*************************** DEPRECATED ***************************/ |
|
| 1559 | 1559 | |
| 1560 | 1560 | |
| 1561 | 1561 | |
@@ -1605,24 +1605,24 @@ discard block |
||
| 1605 | 1605 | |
| 1606 | 1606 | |
| 1607 | 1607 | |
| 1608 | - /** |
|
| 1609 | - * Gets the primary datetime related to this registration via the related Event to this registration |
|
| 1610 | - * |
|
| 1611 | - * @deprecated 4.9.17 |
|
| 1612 | - * @return EE_Datetime |
|
| 1613 | - */ |
|
| 1614 | - public function get_related_primary_datetime() { |
|
| 1615 | - EE_Error::doing_it_wrong( |
|
| 1616 | - __METHOD__, |
|
| 1617 | - esc_html__( |
|
| 1618 | - 'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()', |
|
| 1619 | - 'event_espresso' |
|
| 1620 | - ), |
|
| 1621 | - '4.9.17', |
|
| 1622 | - '5.0.0' |
|
| 1623 | - ); |
|
| 1624 | - return $this->event()->primary_datetime(); |
|
| 1625 | - } |
|
| 1608 | + /** |
|
| 1609 | + * Gets the primary datetime related to this registration via the related Event to this registration |
|
| 1610 | + * |
|
| 1611 | + * @deprecated 4.9.17 |
|
| 1612 | + * @return EE_Datetime |
|
| 1613 | + */ |
|
| 1614 | + public function get_related_primary_datetime() { |
|
| 1615 | + EE_Error::doing_it_wrong( |
|
| 1616 | + __METHOD__, |
|
| 1617 | + esc_html__( |
|
| 1618 | + 'Use EE_Registration::get_latest_related_datetime() or EE_Registration::get_earliest_related_datetime()', |
|
| 1619 | + 'event_espresso' |
|
| 1620 | + ), |
|
| 1621 | + '4.9.17', |
|
| 1622 | + '5.0.0' |
|
| 1623 | + ); |
|
| 1624 | + return $this->event()->primary_datetime(); |
|
| 1625 | + } |
|
| 1626 | 1626 | |
| 1627 | 1627 | |
| 1628 | 1628 | |
@@ -1,7 +1,7 @@ discard block |
||
| 1 | 1 | <?php use EventEspresso\core\exceptions\EntityNotFoundException; |
| 2 | 2 | |
| 3 | -if ( !defined( 'EVENT_ESPRESSO_VERSION' ) ) { |
|
| 4 | - exit( 'No direct script access allowed' ); |
|
| 3 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
| 4 | + exit('No direct script access allowed'); |
|
| 5 | 5 | } |
| 6 | 6 | /** |
| 7 | 7 | * EE_Registration class |
@@ -59,9 +59,9 @@ discard block |
||
| 59 | 59 | * date_format and the second value is the time format |
| 60 | 60 | * @return EE_Registration |
| 61 | 61 | */ |
| 62 | - public static function new_instance( $props_n_values = array(), $timezone = null, $date_formats = array() ) { |
|
| 63 | - $has_object = parent::_check_for_object( $props_n_values, __CLASS__, $timezone, $date_formats ); |
|
| 64 | - return $has_object ? $has_object : new self( $props_n_values, false, $timezone, $date_formats ); |
|
| 62 | + public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array()) { |
|
| 63 | + $has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats); |
|
| 64 | + return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats); |
|
| 65 | 65 | } |
| 66 | 66 | |
| 67 | 67 | |
@@ -72,8 +72,8 @@ discard block |
||
| 72 | 72 | * the website will be used. |
| 73 | 73 | * @return EE_Registration |
| 74 | 74 | */ |
| 75 | - public static function new_instance_from_db( $props_n_values = array(), $timezone = null ) { |
|
| 76 | - return new self( $props_n_values, TRUE, $timezone ); |
|
| 75 | + public static function new_instance_from_db($props_n_values = array(), $timezone = null) { |
|
| 76 | + return new self($props_n_values, TRUE, $timezone); |
|
| 77 | 77 | } |
| 78 | 78 | |
| 79 | 79 | |
@@ -83,8 +83,8 @@ discard block |
||
| 83 | 83 | * |
| 84 | 84 | * @param int $EVT_ID Event ID |
| 85 | 85 | */ |
| 86 | - public function set_event( $EVT_ID = 0 ) { |
|
| 87 | - $this->set( 'EVT_ID', $EVT_ID ); |
|
| 86 | + public function set_event($EVT_ID = 0) { |
|
| 87 | + $this->set('EVT_ID', $EVT_ID); |
|
| 88 | 88 | } |
| 89 | 89 | |
| 90 | 90 | |
@@ -98,18 +98,18 @@ discard block |
||
| 98 | 98 | * @throws \EE_Error |
| 99 | 99 | * @throws \RuntimeException |
| 100 | 100 | */ |
| 101 | - public function set( $field_name, $field_value, $use_default = FALSE ) { |
|
| 102 | - switch( $field_name ) { |
|
| 101 | + public function set($field_name, $field_value, $use_default = FALSE) { |
|
| 102 | + switch ($field_name) { |
|
| 103 | 103 | case 'REG_code' : |
| 104 | - if ( ! empty( $field_value ) && $this->reg_code() === null ) { |
|
| 105 | - $this->set_reg_code( $field_value, $use_default ); |
|
| 104 | + if ( ! empty($field_value) && $this->reg_code() === null) { |
|
| 105 | + $this->set_reg_code($field_value, $use_default); |
|
| 106 | 106 | } |
| 107 | 107 | break; |
| 108 | 108 | case 'STS_ID' : |
| 109 | - $this->set_status( $field_value, $use_default ); |
|
| 109 | + $this->set_status($field_value, $use_default); |
|
| 110 | 110 | break; |
| 111 | 111 | default : |
| 112 | - parent::set( $field_name, $field_value, $use_default ); |
|
| 112 | + parent::set($field_name, $field_value, $use_default); |
|
| 113 | 113 | } |
| 114 | 114 | } |
| 115 | 115 | |
@@ -127,40 +127,40 @@ discard block |
||
| 127 | 127 | * @throws \RuntimeException |
| 128 | 128 | * @throws \EE_Error |
| 129 | 129 | */ |
| 130 | - public function set_status( $new_STS_ID = NULL, $use_default = FALSE ) { |
|
| 130 | + public function set_status($new_STS_ID = NULL, $use_default = FALSE) { |
|
| 131 | 131 | // get current REG_Status |
| 132 | 132 | $old_STS_ID = $this->status_ID(); |
| 133 | 133 | // if status has changed |
| 134 | 134 | if ( |
| 135 | 135 | $old_STS_ID !== $new_STS_ID // and that status has actually changed |
| 136 | - && ! empty( $old_STS_ID ) // and that old status is actually set |
|
| 137 | - && ! empty( $new_STS_ID ) // as well as the new status |
|
| 136 | + && ! empty($old_STS_ID) // and that old status is actually set |
|
| 137 | + && ! empty($new_STS_ID) // as well as the new status |
|
| 138 | 138 | && $this->ID() // ensure registration is in the db |
| 139 | 139 | ) { |
| 140 | 140 | // TO approved |
| 141 | - if ( $new_STS_ID === EEM_Registration::status_id_approved ) { |
|
| 141 | + if ($new_STS_ID === EEM_Registration::status_id_approved) { |
|
| 142 | 142 | // reserve a space by incrementing ticket and datetime sold values |
| 143 | 143 | $this->_reserve_registration_space(); |
| 144 | - do_action( 'AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID ); |
|
| 144 | + do_action('AHEE__EE_Registration__set_status__to_approved', $this, $old_STS_ID, $new_STS_ID); |
|
| 145 | 145 | // OR FROM approved |
| 146 | - } else if ( $old_STS_ID === EEM_Registration::status_id_approved ) { |
|
| 146 | + } else if ($old_STS_ID === EEM_Registration::status_id_approved) { |
|
| 147 | 147 | // release a space by decrementing ticket and datetime sold values |
| 148 | 148 | $this->_release_registration_space(); |
| 149 | - do_action( 'AHEE__EE_Registration__set_status__from_approved', $this, $old_STS_ID, $new_STS_ID ); |
|
| 149 | + do_action('AHEE__EE_Registration__set_status__from_approved', $this, $old_STS_ID, $new_STS_ID); |
|
| 150 | 150 | } |
| 151 | 151 | // update status |
| 152 | 152 | parent::set('STS_ID', $new_STS_ID, $use_default); |
| 153 | 153 | $this->_update_if_canceled_or_declined($new_STS_ID, $old_STS_ID); |
| 154 | 154 | /** @type EE_Transaction_Payments $transaction_payments */ |
| 155 | 155 | $transaction_payments = EE_Registry::instance()->load_class('Transaction_Payments'); |
| 156 | - $transaction_payments->recalculate_transaction_total( $this->transaction(), false ); |
|
| 157 | - $this->transaction()->update_status_based_on_total_paid( true ); |
|
| 158 | - do_action( 'AHEE__EE_Registration__set_status__after_update', $this ); |
|
| 156 | + $transaction_payments->recalculate_transaction_total($this->transaction(), false); |
|
| 157 | + $this->transaction()->update_status_based_on_total_paid(true); |
|
| 158 | + do_action('AHEE__EE_Registration__set_status__after_update', $this); |
|
| 159 | 159 | return TRUE; |
| 160 | 160 | } else { |
| 161 | 161 | //even though the old value matches the new value, it's still good to |
| 162 | 162 | //allow the parent set method to have a say |
| 163 | - parent::set( 'STS_ID', $new_STS_ID, $use_default ); |
|
| 163 | + parent::set('STS_ID', $new_STS_ID, $use_default); |
|
| 164 | 164 | return TRUE; |
| 165 | 165 | } |
| 166 | 166 | } |
@@ -228,7 +228,7 @@ discard block |
||
| 228 | 228 | * get Status ID |
| 229 | 229 | */ |
| 230 | 230 | public function status_ID() { |
| 231 | - return $this->get( 'STS_ID' ); |
|
| 231 | + return $this->get('STS_ID'); |
|
| 232 | 232 | } |
| 233 | 233 | |
| 234 | 234 | |
@@ -259,12 +259,12 @@ discard block |
||
| 259 | 259 | * @return EE_Ticket|EE_Base_Class |
| 260 | 260 | * @throws \EE_Error |
| 261 | 261 | */ |
| 262 | - public function ticket( $include_archived = TRUE ) { |
|
| 262 | + public function ticket($include_archived = TRUE) { |
|
| 263 | 263 | $query_params = array(); |
| 264 | - if ( $include_archived ) { |
|
| 265 | - $query_params[ 'default_where_conditions' ] = 'none'; |
|
| 264 | + if ($include_archived) { |
|
| 265 | + $query_params['default_where_conditions'] = 'none'; |
|
| 266 | 266 | } |
| 267 | - return $this->get_first_related( 'Ticket', $query_params ); |
|
| 267 | + return $this->get_first_related('Ticket', $query_params); |
|
| 268 | 268 | } |
| 269 | 269 | |
| 270 | 270 | |
@@ -292,7 +292,7 @@ discard block |
||
| 292 | 292 | */ |
| 293 | 293 | public function wp_user() { |
| 294 | 294 | $event = $this->event(); |
| 295 | - if ( $event instanceof EE_Event ) { |
|
| 295 | + if ($event instanceof EE_Event) { |
|
| 296 | 296 | return $event->wp_user(); |
| 297 | 297 | } |
| 298 | 298 | return 0; |
@@ -363,8 +363,8 @@ discard block |
||
| 363 | 363 | * |
| 364 | 364 | * @param int $ATT_ID Attendee ID |
| 365 | 365 | */ |
| 366 | - public function set_attendee_id( $ATT_ID = 0 ) { |
|
| 367 | - $this->set( 'ATT_ID', $ATT_ID ); |
|
| 366 | + public function set_attendee_id($ATT_ID = 0) { |
|
| 367 | + $this->set('ATT_ID', $ATT_ID); |
|
| 368 | 368 | } |
| 369 | 369 | |
| 370 | 370 | |
@@ -374,8 +374,8 @@ discard block |
||
| 374 | 374 | * |
| 375 | 375 | * @param int $TXN_ID Transaction ID |
| 376 | 376 | */ |
| 377 | - public function set_transaction_id( $TXN_ID = 0 ) { |
|
| 378 | - $this->set( 'TXN_ID', $TXN_ID ); |
|
| 377 | + public function set_transaction_id($TXN_ID = 0) { |
|
| 378 | + $this->set('TXN_ID', $TXN_ID); |
|
| 379 | 379 | } |
| 380 | 380 | |
| 381 | 381 | |
@@ -385,8 +385,8 @@ discard block |
||
| 385 | 385 | * |
| 386 | 386 | * @param string $REG_session PHP Session ID |
| 387 | 387 | */ |
| 388 | - public function set_session( $REG_session = '' ) { |
|
| 389 | - $this->set( 'REG_session', $REG_session ); |
|
| 388 | + public function set_session($REG_session = '') { |
|
| 389 | + $this->set('REG_session', $REG_session); |
|
| 390 | 390 | } |
| 391 | 391 | |
| 392 | 392 | |
@@ -396,8 +396,8 @@ discard block |
||
| 396 | 396 | * |
| 397 | 397 | * @param string $REG_url_link Registration URL Link |
| 398 | 398 | */ |
| 399 | - public function set_reg_url_link( $REG_url_link = '' ) { |
|
| 400 | - $this->set( 'REG_url_link', $REG_url_link ); |
|
| 399 | + public function set_reg_url_link($REG_url_link = '') { |
|
| 400 | + $this->set('REG_url_link', $REG_url_link); |
|
| 401 | 401 | } |
| 402 | 402 | |
| 403 | 403 | |
@@ -407,8 +407,8 @@ discard block |
||
| 407 | 407 | * |
| 408 | 408 | * @param int $REG_count Primary Attendee |
| 409 | 409 | */ |
| 410 | - public function set_count( $REG_count = 1 ) { |
|
| 411 | - $this->set( 'REG_count', $REG_count ); |
|
| 410 | + public function set_count($REG_count = 1) { |
|
| 411 | + $this->set('REG_count', $REG_count); |
|
| 412 | 412 | } |
| 413 | 413 | |
| 414 | 414 | |
@@ -418,8 +418,8 @@ discard block |
||
| 418 | 418 | * |
| 419 | 419 | * @param boolean $REG_group_size Group Registration |
| 420 | 420 | */ |
| 421 | - public function set_group_size( $REG_group_size = FALSE ) { |
|
| 422 | - $this->set( 'REG_group_size', $REG_group_size ); |
|
| 421 | + public function set_group_size($REG_group_size = FALSE) { |
|
| 422 | + $this->set('REG_group_size', $REG_group_size); |
|
| 423 | 423 | } |
| 424 | 424 | |
| 425 | 425 | |
@@ -495,8 +495,8 @@ discard block |
||
| 495 | 495 | * |
| 496 | 496 | * @param mixed ( int or string ) $REG_date Registration Date - Unix timestamp or string representation of Date |
| 497 | 497 | */ |
| 498 | - public function set_reg_date( $REG_date = FALSE ) { |
|
| 499 | - $this->set( 'REG_date', $REG_date ); |
|
| 498 | + public function set_reg_date($REG_date = FALSE) { |
|
| 499 | + $this->set('REG_date', $REG_date); |
|
| 500 | 500 | } |
| 501 | 501 | |
| 502 | 502 | |
@@ -507,8 +507,8 @@ discard block |
||
| 507 | 507 | * @access public |
| 508 | 508 | * @param float $REG_final_price |
| 509 | 509 | */ |
| 510 | - public function set_final_price( $REG_final_price = 0.00 ) { |
|
| 511 | - $this->set( 'REG_final_price', $REG_final_price ); |
|
| 510 | + public function set_final_price($REG_final_price = 0.00) { |
|
| 511 | + $this->set('REG_final_price', $REG_final_price); |
|
| 512 | 512 | } |
| 513 | 513 | |
| 514 | 514 | |
@@ -519,8 +519,8 @@ discard block |
||
| 519 | 519 | * @access public |
| 520 | 520 | * @param float $REG_paid |
| 521 | 521 | */ |
| 522 | - public function set_paid( $REG_paid = 0.00 ) { |
|
| 523 | - $this->set( 'REG_paid', $REG_paid ); |
|
| 522 | + public function set_paid($REG_paid = 0.00) { |
|
| 523 | + $this->set('REG_paid', $REG_paid); |
|
| 524 | 524 | } |
| 525 | 525 | |
| 526 | 526 | |
@@ -530,8 +530,8 @@ discard block |
||
| 530 | 530 | * |
| 531 | 531 | * @param boolean $REG_att_is_going Attendee Is Going |
| 532 | 532 | */ |
| 533 | - public function set_att_is_going( $REG_att_is_going = FALSE ) { |
|
| 534 | - $this->set( 'REG_att_is_going', $REG_att_is_going ); |
|
| 533 | + public function set_att_is_going($REG_att_is_going = FALSE) { |
|
| 534 | + $this->set('REG_att_is_going', $REG_att_is_going); |
|
| 535 | 535 | } |
| 536 | 536 | |
| 537 | 537 | |
@@ -541,7 +541,7 @@ discard block |
||
| 541 | 541 | * @return EE_Attendee |
| 542 | 542 | */ |
| 543 | 543 | public function attendee() { |
| 544 | - return $this->get_first_related( 'Attendee' ); |
|
| 544 | + return $this->get_first_related('Attendee'); |
|
| 545 | 545 | } |
| 546 | 546 | |
| 547 | 547 | |
@@ -550,7 +550,7 @@ discard block |
||
| 550 | 550 | * get Event ID |
| 551 | 551 | */ |
| 552 | 552 | public function event_ID() { |
| 553 | - return $this->get( 'EVT_ID' ); |
|
| 553 | + return $this->get('EVT_ID'); |
|
| 554 | 554 | } |
| 555 | 555 | |
| 556 | 556 | |
@@ -560,7 +560,7 @@ discard block |
||
| 560 | 560 | */ |
| 561 | 561 | public function event_name() { |
| 562 | 562 | $event = $this->event_obj(); |
| 563 | - if ( $event ) { |
|
| 563 | + if ($event) { |
|
| 564 | 564 | return $event->name(); |
| 565 | 565 | } else { |
| 566 | 566 | return NULL; |
@@ -574,7 +574,7 @@ discard block |
||
| 574 | 574 | * @return EE_Event |
| 575 | 575 | */ |
| 576 | 576 | public function event_obj() { |
| 577 | - return $this->get_first_related( 'Event' ); |
|
| 577 | + return $this->get_first_related('Event'); |
|
| 578 | 578 | } |
| 579 | 579 | |
| 580 | 580 | |
@@ -583,7 +583,7 @@ discard block |
||
| 583 | 583 | * get Attendee ID |
| 584 | 584 | */ |
| 585 | 585 | public function attendee_ID() { |
| 586 | - return $this->get( 'ATT_ID' ); |
|
| 586 | + return $this->get('ATT_ID'); |
|
| 587 | 587 | } |
| 588 | 588 | |
| 589 | 589 | |
@@ -592,7 +592,7 @@ discard block |
||
| 592 | 592 | * get PHP Session ID |
| 593 | 593 | */ |
| 594 | 594 | public function session_ID() { |
| 595 | - return $this->get( 'REG_session' ); |
|
| 595 | + return $this->get('REG_session'); |
|
| 596 | 596 | } |
| 597 | 597 | |
| 598 | 598 | |
@@ -602,7 +602,7 @@ discard block |
||
| 602 | 602 | * @param string $messenger 'pdf' or 'html'. Default 'html'. |
| 603 | 603 | * @return string |
| 604 | 604 | */ |
| 605 | - public function receipt_url( $messenger = 'html' ) { |
|
| 605 | + public function receipt_url($messenger = 'html') { |
|
| 606 | 606 | |
| 607 | 607 | /** |
| 608 | 608 | * The below will be deprecated one version after this. We check first if there is a custom receipt template already in use on old system. If there is then we just return the standard url for it. |
@@ -610,12 +610,12 @@ discard block |
||
| 610 | 610 | * @since 4.5.0 |
| 611 | 611 | */ |
| 612 | 612 | $template_relative_path = 'modules/gateways/Invoice/lib/templates/receipt_body.template.php'; |
| 613 | - $has_custom = EEH_Template::locate_template( $template_relative_path , array(), TRUE, TRUE, TRUE ); |
|
| 613 | + $has_custom = EEH_Template::locate_template($template_relative_path, array(), TRUE, TRUE, TRUE); |
|
| 614 | 614 | |
| 615 | - if ( $has_custom ) { |
|
| 616 | - return add_query_arg( array( 'receipt' => 'true' ), $this->invoice_url( 'launch' ) ); |
|
| 615 | + if ($has_custom) { |
|
| 616 | + return add_query_arg(array('receipt' => 'true'), $this->invoice_url('launch')); |
|
| 617 | 617 | } |
| 618 | - return apply_filters( 'FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt' ); |
|
| 618 | + return apply_filters('FHEE__EE_Registration__receipt_url__receipt_url', '', $this, $messenger, 'receipt'); |
|
| 619 | 619 | } |
| 620 | 620 | |
| 621 | 621 | |
@@ -626,28 +626,28 @@ discard block |
||
| 626 | 626 | * @param string $messenger 'pdf' or 'html'. Default 'html'. |
| 627 | 627 | * @return string |
| 628 | 628 | */ |
| 629 | - public function invoice_url( $messenger = 'html' ) { |
|
| 629 | + public function invoice_url($messenger = 'html') { |
|
| 630 | 630 | /** |
| 631 | 631 | * The below will be deprecated one version after this. We check first if there is a custom invoice template already in use on old system. If there is then we just return the standard url for it. |
| 632 | 632 | * |
| 633 | 633 | * @since 4.5.0 |
| 634 | 634 | */ |
| 635 | 635 | $template_relative_path = 'modules/gateways/Invoice/lib/templates/invoice_body.template.php'; |
| 636 | - $has_custom = EEH_Template::locate_template( $template_relative_path , array(), TRUE, TRUE, TRUE ); |
|
| 636 | + $has_custom = EEH_Template::locate_template($template_relative_path, array(), TRUE, TRUE, TRUE); |
|
| 637 | 637 | |
| 638 | - if ( $has_custom ) { |
|
| 639 | - if ( $messenger == 'html' ) { |
|
| 640 | - return $this->invoice_url( 'launch' ); |
|
| 638 | + if ($has_custom) { |
|
| 639 | + if ($messenger == 'html') { |
|
| 640 | + return $this->invoice_url('launch'); |
|
| 641 | 641 | } |
| 642 | 642 | $route = $messenger == 'download' || $messenger == 'pdf' ? 'download_invoice' : 'launch_invoice'; |
| 643 | 643 | |
| 644 | - $query_args = array( 'ee' => $route, 'id' => $this->reg_url_link() ); |
|
| 645 | - if ( $messenger == 'html' ) { |
|
| 644 | + $query_args = array('ee' => $route, 'id' => $this->reg_url_link()); |
|
| 645 | + if ($messenger == 'html') { |
|
| 646 | 646 | $query_args['html'] = TRUE; |
| 647 | 647 | } |
| 648 | - return add_query_arg( $query_args, get_permalink( EE_Registry::instance()->CFG->core->thank_you_page_id ) ); |
|
| 648 | + return add_query_arg($query_args, get_permalink(EE_Registry::instance()->CFG->core->thank_you_page_id)); |
|
| 649 | 649 | } |
| 650 | - return apply_filters( 'FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice' ); |
|
| 650 | + return apply_filters('FHEE__EE_Registration__invoice_url__invoice_url', '', $this, $messenger, 'invoice'); |
|
| 651 | 651 | } |
| 652 | 652 | |
| 653 | 653 | |
@@ -660,7 +660,7 @@ discard block |
||
| 660 | 660 | * @throws \EE_Error |
| 661 | 661 | */ |
| 662 | 662 | public function reg_url_link() { |
| 663 | - return (string)$this->get( 'REG_url_link' ); |
|
| 663 | + return (string) $this->get('REG_url_link'); |
|
| 664 | 664 | } |
| 665 | 665 | |
| 666 | 666 | |
@@ -670,8 +670,8 @@ discard block |
||
| 670 | 670 | * @param string $type 'download','launch', or 'html' (default is 'launch') |
| 671 | 671 | * @return void |
| 672 | 672 | */ |
| 673 | - public function e_invoice_url( $type = 'launch' ) { |
|
| 674 | - echo $this->invoice_url( $type ); |
|
| 673 | + public function e_invoice_url($type = 'launch') { |
|
| 674 | + echo $this->invoice_url($type); |
|
| 675 | 675 | } |
| 676 | 676 | |
| 677 | 677 | |
@@ -691,7 +691,7 @@ discard block |
||
| 691 | 691 | * @return string |
| 692 | 692 | */ |
| 693 | 693 | public function payment_overview_url() { |
| 694 | - return add_query_arg( array( 'e_reg_url_link' => $this->reg_url_link(), 'step' => 'payment_options', 'revisit' => TRUE ), EE_Registry::instance()->CFG->core->reg_page_url() ); |
|
| 694 | + return add_query_arg(array('e_reg_url_link' => $this->reg_url_link(), 'step' => 'payment_options', 'revisit' => TRUE), EE_Registry::instance()->CFG->core->reg_page_url()); |
|
| 695 | 695 | } |
| 696 | 696 | |
| 697 | 697 | |
@@ -702,7 +702,7 @@ discard block |
||
| 702 | 702 | * @return string |
| 703 | 703 | */ |
| 704 | 704 | public function edit_attendee_information_url() { |
| 705 | - return add_query_arg( array( 'e_reg_url_link' => $this->reg_url_link(), 'step' => 'attendee_information', 'revisit' => TRUE ), EE_Registry::instance()->CFG->core->reg_page_url() ); |
|
| 705 | + return add_query_arg(array('e_reg_url_link' => $this->reg_url_link(), 'step' => 'attendee_information', 'revisit' => TRUE), EE_Registry::instance()->CFG->core->reg_page_url()); |
|
| 706 | 706 | } |
| 707 | 707 | |
| 708 | 708 | |
@@ -712,7 +712,7 @@ discard block |
||
| 712 | 712 | * @return string |
| 713 | 713 | */ |
| 714 | 714 | public function get_admin_edit_url() { |
| 715 | - return EEH_URL::add_query_args_and_nonce( array( 'page' => 'espresso_registrations', 'action' => 'view_registration', '_REG_ID' => $this->ID() ), admin_url( 'admin.php' ) ); |
|
| 715 | + return EEH_URL::add_query_args_and_nonce(array('page' => 'espresso_registrations', 'action' => 'view_registration', '_REG_ID' => $this->ID()), admin_url('admin.php')); |
|
| 716 | 716 | } |
| 717 | 717 | |
| 718 | 718 | |
@@ -721,7 +721,7 @@ discard block |
||
| 721 | 721 | * is_primary_registrant? |
| 722 | 722 | */ |
| 723 | 723 | public function is_primary_registrant() { |
| 724 | - return $this->get( 'REG_count' ) == 1 ? TRUE : FALSE; |
|
| 724 | + return $this->get('REG_count') == 1 ? TRUE : FALSE; |
|
| 725 | 725 | } |
| 726 | 726 | |
| 727 | 727 | |
@@ -730,12 +730,12 @@ discard block |
||
| 730 | 730 | * This returns the primary registration object for this registration group (which may be this object). |
| 731 | 731 | * @return EE_Registration |
| 732 | 732 | */ |
| 733 | - public function get_primary_registration() { |
|
| 734 | - if ( $this->is_primary_registrant() ) |
|
| 733 | + public function get_primary_registration() { |
|
| 734 | + if ($this->is_primary_registrant()) |
|
| 735 | 735 | return $this; |
| 736 | 736 | |
| 737 | 737 | //k reg_count !== 1 so let's get the EE_Registration object matching this txn_id and reg_count == 1 |
| 738 | - $primary_registrant = EEM_Registration::instance()->get_one( array( array('TXN_ID' => $this->transaction_ID(), 'REG_count' => 1 ) ) ); |
|
| 738 | + $primary_registrant = EEM_Registration::instance()->get_one(array(array('TXN_ID' => $this->transaction_ID(), 'REG_count' => 1))); |
|
| 739 | 739 | return $primary_registrant; |
| 740 | 740 | } |
| 741 | 741 | |
@@ -746,7 +746,7 @@ discard block |
||
| 746 | 746 | * @access public |
| 747 | 747 | */ |
| 748 | 748 | public function count() { |
| 749 | - return $this->get( 'REG_count' ); |
|
| 749 | + return $this->get('REG_count'); |
|
| 750 | 750 | } |
| 751 | 751 | |
| 752 | 752 | |
@@ -755,7 +755,7 @@ discard block |
||
| 755 | 755 | * get Group Size |
| 756 | 756 | */ |
| 757 | 757 | public function group_size() { |
| 758 | - return $this->get( 'REG_group_size' ); |
|
| 758 | + return $this->get('REG_group_size'); |
|
| 759 | 759 | } |
| 760 | 760 | |
| 761 | 761 | |
@@ -764,7 +764,7 @@ discard block |
||
| 764 | 764 | * get Registration Date |
| 765 | 765 | */ |
| 766 | 766 | public function date() { |
| 767 | - return $this->get( 'REG_date' ); |
|
| 767 | + return $this->get('REG_date'); |
|
| 768 | 768 | } |
| 769 | 769 | |
| 770 | 770 | |
@@ -775,8 +775,8 @@ discard block |
||
| 775 | 775 | * @param string $time_format |
| 776 | 776 | * @return string |
| 777 | 777 | */ |
| 778 | - public function pretty_date( $date_format = NULL, $time_format = NULL ) { |
|
| 779 | - return $this->get_datetime( 'REG_date', $date_format, $time_format ); |
|
| 778 | + public function pretty_date($date_format = NULL, $time_format = NULL) { |
|
| 779 | + return $this->get_datetime('REG_date', $date_format, $time_format); |
|
| 780 | 780 | } |
| 781 | 781 | |
| 782 | 782 | |
@@ -788,7 +788,7 @@ discard block |
||
| 788 | 788 | * @return float |
| 789 | 789 | */ |
| 790 | 790 | public function final_price() { |
| 791 | - return $this->get( 'REG_final_price' ); |
|
| 791 | + return $this->get('REG_final_price'); |
|
| 792 | 792 | } |
| 793 | 793 | |
| 794 | 794 | |
@@ -799,7 +799,7 @@ discard block |
||
| 799 | 799 | * @return string |
| 800 | 800 | */ |
| 801 | 801 | public function pretty_final_price() { |
| 802 | - return $this->get_pretty( 'REG_final_price' ); |
|
| 802 | + return $this->get_pretty('REG_final_price'); |
|
| 803 | 803 | } |
| 804 | 804 | |
| 805 | 805 | |
@@ -809,7 +809,7 @@ discard block |
||
| 809 | 809 | * @return float |
| 810 | 810 | */ |
| 811 | 811 | public function paid() { |
| 812 | - return $this->get( 'REG_paid' ); |
|
| 812 | + return $this->get('REG_paid'); |
|
| 813 | 813 | } |
| 814 | 814 | |
| 815 | 815 | |
@@ -819,7 +819,7 @@ discard block |
||
| 819 | 819 | * @return float |
| 820 | 820 | */ |
| 821 | 821 | public function pretty_paid() { |
| 822 | - return $this->get_pretty( 'REG_paid' ); |
|
| 822 | + return $this->get_pretty('REG_paid'); |
|
| 823 | 823 | } |
| 824 | 824 | |
| 825 | 825 | |
@@ -830,11 +830,11 @@ discard block |
||
| 830 | 830 | * @param array $requires_payment |
| 831 | 831 | * @return bool |
| 832 | 832 | */ |
| 833 | - public function owes_monies_and_can_pay( $requires_payment = array()) { |
|
| 833 | + public function owes_monies_and_can_pay($requires_payment = array()) { |
|
| 834 | 834 | // these reg statuses require payment (if event is not free) |
| 835 | - $requires_payment = ! empty( $requires_payment ) ? $requires_payment : EEM_Registration::reg_statuses_that_allow_payment(); |
|
| 835 | + $requires_payment = ! empty($requires_payment) ? $requires_payment : EEM_Registration::reg_statuses_that_allow_payment(); |
|
| 836 | 836 | if ( |
| 837 | - in_array( $this->status_ID(), $requires_payment ) && |
|
| 837 | + in_array($this->status_ID(), $requires_payment) && |
|
| 838 | 838 | $this->final_price() != 0 && |
| 839 | 839 | $this->final_price() != $this->paid() |
| 840 | 840 | ) { |
@@ -851,8 +851,8 @@ discard block |
||
| 851 | 851 | * @param bool $show_icons |
| 852 | 852 | * @return void |
| 853 | 853 | */ |
| 854 | - public function e_pretty_status( $show_icons = FALSE ) { |
|
| 855 | - echo $this->pretty_status( $show_icons ); |
|
| 854 | + public function e_pretty_status($show_icons = FALSE) { |
|
| 855 | + echo $this->pretty_status($show_icons); |
|
| 856 | 856 | } |
| 857 | 857 | |
| 858 | 858 | |
@@ -863,10 +863,10 @@ discard block |
||
| 863 | 863 | * @param bool $show_icons |
| 864 | 864 | * @return string |
| 865 | 865 | */ |
| 866 | - public function pretty_status( $show_icons = FALSE ) { |
|
| 867 | - $status = EEM_Status::instance()->localized_status( array( $this->status_ID() => __( 'unknown', 'event_espresso' ) ), FALSE, 'sentence' ); |
|
| 866 | + public function pretty_status($show_icons = FALSE) { |
|
| 867 | + $status = EEM_Status::instance()->localized_status(array($this->status_ID() => __('unknown', 'event_espresso')), FALSE, 'sentence'); |
|
| 868 | 868 | $icon = ''; |
| 869 | - switch ( $this->status_ID() ) { |
|
| 869 | + switch ($this->status_ID()) { |
|
| 870 | 870 | case EEM_Registration::status_id_approved: |
| 871 | 871 | $icon = $show_icons ? '<span class="dashicons dashicons-star-filled ee-icon-size-16 green-text"></span>' : ''; |
| 872 | 872 | break; |
@@ -889,7 +889,7 @@ discard block |
||
| 889 | 889 | $icon = $show_icons ? '<span class="dashicons dashicons-clipboard ee-icon-size-16 purple-text"></span>' : ''; |
| 890 | 890 | break; |
| 891 | 891 | } |
| 892 | - return $icon . $status[ $this->status_ID() ]; |
|
| 892 | + return $icon.$status[$this->status_ID()]; |
|
| 893 | 893 | } |
| 894 | 894 | |
| 895 | 895 | |
@@ -898,7 +898,7 @@ discard block |
||
| 898 | 898 | * get Attendee Is Going |
| 899 | 899 | */ |
| 900 | 900 | public function att_is_going() { |
| 901 | - return $this->get( 'REG_att_is_going' ); |
|
| 901 | + return $this->get('REG_att_is_going'); |
|
| 902 | 902 | } |
| 903 | 903 | |
| 904 | 904 | |
@@ -908,8 +908,8 @@ discard block |
||
| 908 | 908 | * @param array $query_params like EEM_Base::get_all |
| 909 | 909 | * @return EE_Answer[] |
| 910 | 910 | */ |
| 911 | - public function answers( $query_params = NULL ) { |
|
| 912 | - return $this->get_many_related( 'Answer', $query_params ); |
|
| 911 | + public function answers($query_params = NULL) { |
|
| 912 | + return $this->get_many_related('Answer', $query_params); |
|
| 913 | 913 | } |
| 914 | 914 | |
| 915 | 915 | |
@@ -923,9 +923,9 @@ discard block |
||
| 923 | 923 | * (because the answer might be an array of answer values, so passing pretty_value=true |
| 924 | 924 | * will convert it into some kind of string) |
| 925 | 925 | */ |
| 926 | - public function answer_value_to_question( $question, $pretty_value=true ) { |
|
| 926 | + public function answer_value_to_question($question, $pretty_value = true) { |
|
| 927 | 927 | $question_id = EEM_Question::instance()->ensure_is_ID($question); |
| 928 | - return EEM_Answer::instance()->get_answer_value_to_question($this,$question_id,$pretty_value); |
|
| 928 | + return EEM_Answer::instance()->get_answer_value_to_question($this, $question_id, $pretty_value); |
|
| 929 | 929 | } |
| 930 | 930 | |
| 931 | 931 | |
@@ -938,13 +938,13 @@ discard block |
||
| 938 | 938 | */ |
| 939 | 939 | public function question_groups() { |
| 940 | 940 | $question_groups = array(); |
| 941 | - if ( $this->event() instanceof EE_Event ) { |
|
| 941 | + if ($this->event() instanceof EE_Event) { |
|
| 942 | 942 | $question_groups = $this->event()->question_groups( |
| 943 | 943 | array( |
| 944 | 944 | array( |
| 945 | 945 | 'Event_Question_Group.EQG_primary' => $this->count() == 1 ? true : false |
| 946 | 946 | ), |
| 947 | - 'order_by' => array( 'QSG_order' => 'ASC' ) |
|
| 947 | + 'order_by' => array('QSG_order' => 'ASC') |
|
| 948 | 948 | ) |
| 949 | 949 | ); |
| 950 | 950 | } |
@@ -961,7 +961,7 @@ discard block |
||
| 961 | 961 | */ |
| 962 | 962 | public function count_question_groups() { |
| 963 | 963 | $qg_count = 0; |
| 964 | - if ( $this->event() instanceof EE_Event ) { |
|
| 964 | + if ($this->event() instanceof EE_Event) { |
|
| 965 | 965 | $qg_count = $this->event()->count_related( |
| 966 | 966 | 'Question_Group', |
| 967 | 967 | array( |
@@ -982,7 +982,7 @@ discard block |
||
| 982 | 982 | * @return string |
| 983 | 983 | */ |
| 984 | 984 | public function reg_date() { |
| 985 | - return $this->get_datetime( 'REG_date' ); |
|
| 985 | + return $this->get_datetime('REG_date'); |
|
| 986 | 986 | } |
| 987 | 987 | |
| 988 | 988 | |
@@ -994,7 +994,7 @@ discard block |
||
| 994 | 994 | * @return EE_Datetime_Ticket |
| 995 | 995 | */ |
| 996 | 996 | public function datetime_ticket() { |
| 997 | - return $this->get_first_related( 'Datetime_Ticket' ); |
|
| 997 | + return $this->get_first_related('Datetime_Ticket'); |
|
| 998 | 998 | } |
| 999 | 999 | |
| 1000 | 1000 | |
@@ -1004,15 +1004,15 @@ discard block |
||
| 1004 | 1004 | * @param EE_Datetime_Ticket $datetime_ticket |
| 1005 | 1005 | * @return EE_Datetime_Ticket |
| 1006 | 1006 | */ |
| 1007 | - public function set_datetime_ticket( $datetime_ticket ) { |
|
| 1008 | - return $this->_add_relation_to( $datetime_ticket, 'Datetime_Ticket' ); |
|
| 1007 | + public function set_datetime_ticket($datetime_ticket) { |
|
| 1008 | + return $this->_add_relation_to($datetime_ticket, 'Datetime_Ticket'); |
|
| 1009 | 1009 | } |
| 1010 | 1010 | /** |
| 1011 | 1011 | * Gets deleted |
| 1012 | 1012 | * @return boolean |
| 1013 | 1013 | */ |
| 1014 | 1014 | public function deleted() { |
| 1015 | - return $this->get( 'REG_deleted' ); |
|
| 1015 | + return $this->get('REG_deleted'); |
|
| 1016 | 1016 | } |
| 1017 | 1017 | |
| 1018 | 1018 | /** |
@@ -1021,7 +1021,7 @@ discard block |
||
| 1021 | 1021 | * @return boolean |
| 1022 | 1022 | */ |
| 1023 | 1023 | public function set_deleted($deleted) { |
| 1024 | - if ( $deleted ) { |
|
| 1024 | + if ($deleted) { |
|
| 1025 | 1025 | $this->delete(); |
| 1026 | 1026 | } else { |
| 1027 | 1027 | $this->restore(); |
@@ -1035,7 +1035,7 @@ discard block |
||
| 1035 | 1035 | * @return EE_Status |
| 1036 | 1036 | */ |
| 1037 | 1037 | public function status_obj() { |
| 1038 | - return $this->get_first_related( 'Status' ); |
|
| 1038 | + return $this->get_first_related('Status'); |
|
| 1039 | 1039 | } |
| 1040 | 1040 | |
| 1041 | 1041 | |
@@ -1046,7 +1046,7 @@ discard block |
||
| 1046 | 1046 | * @return int |
| 1047 | 1047 | */ |
| 1048 | 1048 | public function count_checkins() { |
| 1049 | - return $this->get_model()->count_related( $this, 'Checkin' ); |
|
| 1049 | + return $this->get_model()->count_related($this, 'Checkin'); |
|
| 1050 | 1050 | } |
| 1051 | 1051 | |
| 1052 | 1052 | |
@@ -1056,7 +1056,7 @@ discard block |
||
| 1056 | 1056 | * @return int |
| 1057 | 1057 | */ |
| 1058 | 1058 | public function count_checkins_not_checkedout() { |
| 1059 | - return $this->get_model()->count_related( $this, 'Checkin', array( array( 'CHK_in' => 1 ) ) ); |
|
| 1059 | + return $this->get_model()->count_related($this, 'Checkin', array(array('CHK_in' => 1))); |
|
| 1060 | 1060 | } |
| 1061 | 1061 | |
| 1062 | 1062 | |
@@ -1069,20 +1069,20 @@ discard block |
||
| 1069 | 1069 | * |
| 1070 | 1070 | * @return bool |
| 1071 | 1071 | */ |
| 1072 | - public function can_checkin( $DTT_OR_ID, $check_approved = TRUE ) { |
|
| 1073 | - $DTT_ID = EEM_Datetime::instance()->ensure_is_ID( $DTT_OR_ID ); |
|
| 1072 | + public function can_checkin($DTT_OR_ID, $check_approved = TRUE) { |
|
| 1073 | + $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID); |
|
| 1074 | 1074 | |
| 1075 | 1075 | //first check registration status |
| 1076 | - if ( ( $check_approved && ! $this->is_approved() ) || ! $DTT_ID ) { |
|
| 1076 | + if (($check_approved && ! $this->is_approved()) || ! $DTT_ID) { |
|
| 1077 | 1077 | return false; |
| 1078 | 1078 | } |
| 1079 | 1079 | //is there a datetime ticket that matches this dtt_ID? |
| 1080 | - if ( ! ( EEM_Datetime_Ticket::instance()->exists( array( array( 'TKT_ID' => $this->get('TKT_ID' ), 'DTT_ID' => $DTT_ID ) ) ) ) ) { |
|
| 1080 | + if ( ! (EEM_Datetime_Ticket::instance()->exists(array(array('TKT_ID' => $this->get('TKT_ID'), 'DTT_ID' => $DTT_ID))))) { |
|
| 1081 | 1081 | return false; |
| 1082 | 1082 | } |
| 1083 | 1083 | |
| 1084 | 1084 | //final check is against TKT_uses |
| 1085 | - return $this->verify_can_checkin_against_TKT_uses( $DTT_ID ); |
|
| 1085 | + return $this->verify_can_checkin_against_TKT_uses($DTT_ID); |
|
| 1086 | 1086 | } |
| 1087 | 1087 | |
| 1088 | 1088 | |
@@ -1095,10 +1095,10 @@ discard block |
||
| 1095 | 1095 | * @param int | EE_Datetime $DTT_OR_ID The datetime the registration is being checked against |
| 1096 | 1096 | * @return bool true means can checkin. false means cannot checkin. |
| 1097 | 1097 | */ |
| 1098 | - public function verify_can_checkin_against_TKT_uses( $DTT_OR_ID ) { |
|
| 1099 | - $DTT_ID = EEM_Datetime::instance()->ensure_is_ID( $DTT_OR_ID ); |
|
| 1098 | + public function verify_can_checkin_against_TKT_uses($DTT_OR_ID) { |
|
| 1099 | + $DTT_ID = EEM_Datetime::instance()->ensure_is_ID($DTT_OR_ID); |
|
| 1100 | 1100 | |
| 1101 | - if ( ! $DTT_ID ) { |
|
| 1101 | + if ( ! $DTT_ID) { |
|
| 1102 | 1102 | return false; |
| 1103 | 1103 | } |
| 1104 | 1104 | |
@@ -1106,23 +1106,23 @@ discard block |
||
| 1106 | 1106 | |
| 1107 | 1107 | // if max uses is not set or equals infinity then return true cause its not a factor for whether user can check-in |
| 1108 | 1108 | // or not. |
| 1109 | - if ( ! $max_uses || $max_uses === EE_INF ) { |
|
| 1109 | + if ( ! $max_uses || $max_uses === EE_INF) { |
|
| 1110 | 1110 | return true; |
| 1111 | 1111 | } |
| 1112 | 1112 | |
| 1113 | 1113 | //does this datetime have a checkin record? If so, then the dtt count has already been verified so we can just |
| 1114 | 1114 | //go ahead and toggle. |
| 1115 | - if ( EEM_Checkin::instance()->exists( array( array( 'REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID ) ) ) ) { |
|
| 1115 | + if (EEM_Checkin::instance()->exists(array(array('REG_ID' => $this->ID(), 'DTT_ID' => $DTT_ID)))) { |
|
| 1116 | 1116 | return true; |
| 1117 | 1117 | } |
| 1118 | 1118 | |
| 1119 | 1119 | //made it here so the last check is whether the number of checkins per unique datetime on this registration |
| 1120 | 1120 | //disallows further check-ins. |
| 1121 | - $count_unique_dtt_checkins = EEM_Checkin::instance()->count( array( array( 'REG_ID' => $this->ID(), 'CHK_in' => true ) ), 'DTT_ID', true ); |
|
| 1121 | + $count_unique_dtt_checkins = EEM_Checkin::instance()->count(array(array('REG_ID' => $this->ID(), 'CHK_in' => true)), 'DTT_ID', true); |
|
| 1122 | 1122 | // checkins have already reached their max number of uses |
| 1123 | 1123 | // so registrant can NOT checkin |
| 1124 | - if ( $count_unique_dtt_checkins >= $max_uses ) { |
|
| 1125 | - EE_Error::add_error( __( 'Check-in denied because number of datetime uses for the ticket has been reached or exceeded.', 'event_espresso' ), __FILE__, __FUNCTION__, __LINE__ ); |
|
| 1124 | + if ($count_unique_dtt_checkins >= $max_uses) { |
|
| 1125 | + EE_Error::add_error(__('Check-in denied because number of datetime uses for the ticket has been reached or exceeded.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__); |
|
| 1126 | 1126 | return false; |
| 1127 | 1127 | } |
| 1128 | 1128 | return true; |
@@ -1144,15 +1144,15 @@ discard block |
||
| 1144 | 1144 | * @return bool|int the chk_in status toggled to OR false if nothing got changed. |
| 1145 | 1145 | * @throws EE_Error |
| 1146 | 1146 | */ |
| 1147 | - public function toggle_checkin_status( $DTT_ID = null, $verify = false ) { |
|
| 1148 | - if ( empty( $DTT_ID ) ) { |
|
| 1147 | + public function toggle_checkin_status($DTT_ID = null, $verify = false) { |
|
| 1148 | + if (empty($DTT_ID)) { |
|
| 1149 | 1149 | $datetime = $this->get_latest_related_datetime(); |
| 1150 | 1150 | $DTT_ID = $datetime instanceof EE_Datetime ? $datetime->ID() : 0; |
| 1151 | 1151 | // verify the registration can checkin for the given DTT_ID |
| 1152 | - } elseif ( ! $this->can_checkin( $DTT_ID, $verify ) ) { |
|
| 1152 | + } elseif ( ! $this->can_checkin($DTT_ID, $verify)) { |
|
| 1153 | 1153 | EE_Error::add_error( |
| 1154 | 1154 | sprintf( |
| 1155 | - __( 'The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access', 'event_espresso'), |
|
| 1155 | + __('The given registration (ID:%1$d) can not be checked in to the given DTT_ID (%2$d), because the registration does not have access', 'event_espresso'), |
|
| 1156 | 1156 | $this->ID(), |
| 1157 | 1157 | $DTT_ID |
| 1158 | 1158 | ), |
@@ -1166,8 +1166,8 @@ discard block |
||
| 1166 | 1166 | EE_Registration::checkin_status_out => EE_Registration::checkin_status_in |
| 1167 | 1167 | ); |
| 1168 | 1168 | //start by getting the current status so we know what status we'll be changing to. |
| 1169 | - $cur_status = $this->check_in_status_for_datetime( $DTT_ID, NULL ); |
|
| 1170 | - $status_to = $status_paths[ $cur_status ]; |
|
| 1169 | + $cur_status = $this->check_in_status_for_datetime($DTT_ID, NULL); |
|
| 1170 | + $status_to = $status_paths[$cur_status]; |
|
| 1171 | 1171 | // database only records true for checked IN or false for checked OUT |
| 1172 | 1172 | // no record ( null ) means checked in NEVER, but we obviously don't save that |
| 1173 | 1173 | $new_status = $status_to === EE_Registration::checkin_status_in ? true : false; |
@@ -1175,24 +1175,24 @@ discard block |
||
| 1175 | 1175 | // because we are keeping track of Check-ins over time. |
| 1176 | 1176 | // Eventually we'll probably want to show a list table |
| 1177 | 1177 | // for the individual Check-ins so that they can be managed. |
| 1178 | - $checkin = EE_Checkin::new_instance( array( |
|
| 1178 | + $checkin = EE_Checkin::new_instance(array( |
|
| 1179 | 1179 | 'REG_ID' => $this->ID(), |
| 1180 | 1180 | 'DTT_ID' => $DTT_ID, |
| 1181 | 1181 | 'CHK_in' => $new_status |
| 1182 | - ) ); |
|
| 1182 | + )); |
|
| 1183 | 1183 | // if the record could not be saved then return false |
| 1184 | - if ( $checkin->save() === 0 ) { |
|
| 1185 | - if ( WP_DEBUG ) { |
|
| 1184 | + if ($checkin->save() === 0) { |
|
| 1185 | + if (WP_DEBUG) { |
|
| 1186 | 1186 | global $wpdb; |
| 1187 | 1187 | $error = sprintf( |
| 1188 | - __( 'Registration check in update failed because of the following database error: %1$s%2$s', 'event_espresso' ), |
|
| 1188 | + __('Registration check in update failed because of the following database error: %1$s%2$s', 'event_espresso'), |
|
| 1189 | 1189 | '<br />', |
| 1190 | 1190 | $wpdb->last_error |
| 1191 | 1191 | ); |
| 1192 | 1192 | } else { |
| 1193 | - $error = __( 'Registration check in update failed because of an unknown database error', 'event_espresso' ); |
|
| 1193 | + $error = __('Registration check in update failed because of an unknown database error', 'event_espresso'); |
|
| 1194 | 1194 | } |
| 1195 | - EE_Error::add_error( $error, __FILE__, __FUNCTION__, __LINE__ ); |
|
| 1195 | + EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__); |
|
| 1196 | 1196 | return false; |
| 1197 | 1197 | } |
| 1198 | 1198 | return $status_to; |
@@ -1213,7 +1213,7 @@ discard block |
||
| 1213 | 1213 | array( |
| 1214 | 1214 | 'Ticket.Registration.REG_ID' => $this->ID() |
| 1215 | 1215 | ), |
| 1216 | - 'order_by' => array( 'DTT_EVT_start' => 'DESC' ) |
|
| 1216 | + 'order_by' => array('DTT_EVT_start' => 'DESC') |
|
| 1217 | 1217 | ) |
| 1218 | 1218 | ); |
| 1219 | 1219 | } |
@@ -1232,7 +1232,7 @@ discard block |
||
| 1232 | 1232 | array( |
| 1233 | 1233 | 'Ticket.Registration.REG_ID' => $this->ID() |
| 1234 | 1234 | ), |
| 1235 | - 'order_by' => array( 'DTT_EVT_start' => 'ASC' ) |
|
| 1235 | + 'order_by' => array('DTT_EVT_start' => 'ASC') |
|
| 1236 | 1236 | ) |
| 1237 | 1237 | ); |
| 1238 | 1238 | } |
@@ -1251,21 +1251,21 @@ discard block |
||
| 1251 | 1251 | * @return int Integer representing Check-in status. |
| 1252 | 1252 | * @throws \EE_Error |
| 1253 | 1253 | */ |
| 1254 | - public function check_in_status_for_datetime( $DTT_ID = 0, $checkin = null ) { |
|
| 1254 | + public function check_in_status_for_datetime($DTT_ID = 0, $checkin = null) { |
|
| 1255 | 1255 | $checkin_query_params = array( |
| 1256 | - 'order_by' => array( 'CHK_timestamp' => 'DESC' ) |
|
| 1256 | + 'order_by' => array('CHK_timestamp' => 'DESC') |
|
| 1257 | 1257 | ); |
| 1258 | 1258 | |
| 1259 | - if ( $DTT_ID > 0 ) { |
|
| 1260 | - $checkin_query_params[0] = array( 'DTT_ID' => $DTT_ID ); |
|
| 1259 | + if ($DTT_ID > 0) { |
|
| 1260 | + $checkin_query_params[0] = array('DTT_ID' => $DTT_ID); |
|
| 1261 | 1261 | } |
| 1262 | 1262 | |
| 1263 | 1263 | //get checkin object (if exists) |
| 1264 | 1264 | $checkin = $checkin instanceof EE_Checkin |
| 1265 | 1265 | ? $checkin |
| 1266 | - : $this->get_first_related( 'Checkin', $checkin_query_params ); |
|
| 1267 | - if ( $checkin instanceof EE_Checkin ) { |
|
| 1268 | - if ( $checkin->get( 'CHK_in' ) ) { |
|
| 1266 | + : $this->get_first_related('Checkin', $checkin_query_params); |
|
| 1267 | + if ($checkin instanceof EE_Checkin) { |
|
| 1268 | + if ($checkin->get('CHK_in')) { |
|
| 1269 | 1269 | return EE_Registration::checkin_status_in; //checked in |
| 1270 | 1270 | } |
| 1271 | 1271 | return EE_Registration::checkin_status_out; //had checked in but is now checked out. |
@@ -1281,28 +1281,28 @@ discard block |
||
| 1281 | 1281 | * @param bool $error This just flags that you want an error message returned. This is put in so that the error message can be customized with the attendee name. |
| 1282 | 1282 | * @return string internationalized message |
| 1283 | 1283 | */ |
| 1284 | - public function get_checkin_msg( $DTT_ID, $error = FALSE ) { |
|
| 1284 | + public function get_checkin_msg($DTT_ID, $error = FALSE) { |
|
| 1285 | 1285 | //let's get the attendee first so we can include the name of the attendee |
| 1286 | - $attendee = $this->get_first_related( 'Attendee' ); |
|
| 1287 | - if ( $attendee instanceof EE_Attendee ) { |
|
| 1288 | - if ( $error ) { |
|
| 1289 | - return sprintf( __( "%s's check-in status was not changed.", "event_espresso" ), $attendee->full_name() ); |
|
| 1286 | + $attendee = $this->get_first_related('Attendee'); |
|
| 1287 | + if ($attendee instanceof EE_Attendee) { |
|
| 1288 | + if ($error) { |
|
| 1289 | + return sprintf(__("%s's check-in status was not changed.", "event_espresso"), $attendee->full_name()); |
|
| 1290 | 1290 | } |
| 1291 | - $cur_status = $this->check_in_status_for_datetime( $DTT_ID ); |
|
| 1291 | + $cur_status = $this->check_in_status_for_datetime($DTT_ID); |
|
| 1292 | 1292 | //what is the status message going to be? |
| 1293 | - switch ( $cur_status ) { |
|
| 1293 | + switch ($cur_status) { |
|
| 1294 | 1294 | case EE_Registration::checkin_status_never : |
| 1295 | - return sprintf( __( "%s has been removed from Check-in records", "event_espresso" ), $attendee->full_name() ); |
|
| 1295 | + return sprintf(__("%s has been removed from Check-in records", "event_espresso"), $attendee->full_name()); |
|
| 1296 | 1296 | break; |
| 1297 | 1297 | case EE_Registration::checkin_status_in : |
| 1298 | - return sprintf( __( '%s has been checked in', 'event_espresso' ), $attendee->full_name() ); |
|
| 1298 | + return sprintf(__('%s has been checked in', 'event_espresso'), $attendee->full_name()); |
|
| 1299 | 1299 | break; |
| 1300 | 1300 | case EE_Registration::checkin_status_out : |
| 1301 | - return sprintf( __( '%s has been checked out', 'event_espresso' ), $attendee->full_name() ); |
|
| 1301 | + return sprintf(__('%s has been checked out', 'event_espresso'), $attendee->full_name()); |
|
| 1302 | 1302 | break; |
| 1303 | 1303 | } |
| 1304 | 1304 | } |
| 1305 | - return __( "The check-in status could not be determined.", "event_espresso" ); |
|
| 1305 | + return __("The check-in status could not be determined.", "event_espresso"); |
|
| 1306 | 1306 | } |
| 1307 | 1307 | |
| 1308 | 1308 | |
@@ -1326,7 +1326,7 @@ discard block |
||
| 1326 | 1326 | * get Registration Code |
| 1327 | 1327 | */ |
| 1328 | 1328 | public function reg_code() { |
| 1329 | - return $this->get( 'REG_code' ); |
|
| 1329 | + return $this->get('REG_code'); |
|
| 1330 | 1330 | } |
| 1331 | 1331 | |
| 1332 | 1332 | |
@@ -1335,7 +1335,7 @@ discard block |
||
| 1335 | 1335 | * get Transaction ID |
| 1336 | 1336 | */ |
| 1337 | 1337 | public function transaction_ID() { |
| 1338 | - return $this->get( 'TXN_ID' ); |
|
| 1338 | + return $this->get('TXN_ID'); |
|
| 1339 | 1339 | } |
| 1340 | 1340 | |
| 1341 | 1341 | |
@@ -1344,7 +1344,7 @@ discard block |
||
| 1344 | 1344 | * @return int |
| 1345 | 1345 | */ |
| 1346 | 1346 | public function ticket_ID() { |
| 1347 | - return $this->get( 'TKT_ID' ); |
|
| 1347 | + return $this->get('TKT_ID'); |
|
| 1348 | 1348 | } |
| 1349 | 1349 | |
| 1350 | 1350 | |
@@ -1356,17 +1356,17 @@ discard block |
||
| 1356 | 1356 | * @param string $REG_code Registration Code |
| 1357 | 1357 | * @param boolean $use_default |
| 1358 | 1358 | */ |
| 1359 | - public function set_reg_code( $REG_code, $use_default = FALSE ) { |
|
| 1360 | - if ( empty( $REG_code )) { |
|
| 1361 | - EE_Error::add_error( __( 'REG_code can not be empty.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__ ); |
|
| 1359 | + public function set_reg_code($REG_code, $use_default = FALSE) { |
|
| 1360 | + if (empty($REG_code)) { |
|
| 1361 | + EE_Error::add_error(__('REG_code can not be empty.', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__); |
|
| 1362 | 1362 | return; |
| 1363 | 1363 | } |
| 1364 | - if ( ! $this->reg_code() ) { |
|
| 1365 | - parent::set( 'REG_code', $REG_code, $use_default ); |
|
| 1364 | + if ( ! $this->reg_code()) { |
|
| 1365 | + parent::set('REG_code', $REG_code, $use_default); |
|
| 1366 | 1366 | } else { |
| 1367 | 1367 | EE_Error::doing_it_wrong( |
| 1368 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 1369 | - __( 'Can not change a registration REG_code once it has been set.', 'event_espresso' ), |
|
| 1368 | + __CLASS__.'::'.__FUNCTION__, |
|
| 1369 | + __('Can not change a registration REG_code once it has been set.', 'event_espresso'), |
|
| 1370 | 1370 | '4.6.0' |
| 1371 | 1371 | ); |
| 1372 | 1372 | } |
@@ -1386,17 +1386,17 @@ discard block |
||
| 1386 | 1386 | * @return EE_Registration[] or empty array if this isn't a group registration. |
| 1387 | 1387 | */ |
| 1388 | 1388 | public function get_all_other_registrations_in_group() { |
| 1389 | - if ( $this->group_size() < 2 ) { |
|
| 1389 | + if ($this->group_size() < 2) { |
|
| 1390 | 1390 | return array(); |
| 1391 | 1391 | } |
| 1392 | 1392 | |
| 1393 | 1393 | $query[0] = array( |
| 1394 | 1394 | 'TXN_ID' => $this->transaction_ID(), |
| 1395 | - 'REG_ID' => array( '!=', $this->ID() ), |
|
| 1395 | + 'REG_ID' => array('!=', $this->ID()), |
|
| 1396 | 1396 | 'TKT_ID' => $this->ticket_ID() |
| 1397 | 1397 | ); |
| 1398 | 1398 | |
| 1399 | - $registrations = $this->get_model()->get_all( $query ); |
|
| 1399 | + $registrations = $this->get_model()->get_all($query); |
|
| 1400 | 1400 | return $registrations; |
| 1401 | 1401 | } |
| 1402 | 1402 | |
@@ -1405,14 +1405,14 @@ discard block |
||
| 1405 | 1405 | * @return string |
| 1406 | 1406 | */ |
| 1407 | 1407 | public function get_admin_details_link() { |
| 1408 | - EE_Registry::instance()->load_helper( 'URL' ); |
|
| 1408 | + EE_Registry::instance()->load_helper('URL'); |
|
| 1409 | 1409 | return EEH_URL::add_query_args_and_nonce( |
| 1410 | 1410 | array( |
| 1411 | 1411 | 'page' => 'espresso_registrations', |
| 1412 | 1412 | 'action' => 'view_registration', |
| 1413 | 1413 | '_REG_ID' => $this->ID() |
| 1414 | 1414 | ), |
| 1415 | - admin_url( 'admin.php' ) |
|
| 1415 | + admin_url('admin.php') |
|
| 1416 | 1416 | ); |
| 1417 | 1417 | } |
| 1418 | 1418 | |
@@ -1437,12 +1437,12 @@ discard block |
||
| 1437 | 1437 | * @return string |
| 1438 | 1438 | */ |
| 1439 | 1439 | public function get_admin_overview_link() { |
| 1440 | - EE_Registry::instance()->load_helper( 'URL' ); |
|
| 1440 | + EE_Registry::instance()->load_helper('URL'); |
|
| 1441 | 1441 | return EEH_URL::add_query_args_and_nonce( |
| 1442 | 1442 | array( |
| 1443 | 1443 | 'page' => 'espresso_registrations' |
| 1444 | 1444 | ), |
| 1445 | - admin_url( 'admin.php' ) |
|
| 1445 | + admin_url('admin.php') |
|
| 1446 | 1446 | ); |
| 1447 | 1447 | } |
| 1448 | 1448 | |
@@ -1453,8 +1453,8 @@ discard block |
||
| 1453 | 1453 | * @return \EE_Registration[] |
| 1454 | 1454 | * @throws \EE_Error |
| 1455 | 1455 | */ |
| 1456 | - public function payments( $query_params = array() ) { |
|
| 1457 | - return $this->get_many_related( 'Payment', $query_params ); |
|
| 1456 | + public function payments($query_params = array()) { |
|
| 1457 | + return $this->get_many_related('Payment', $query_params); |
|
| 1458 | 1458 | } |
| 1459 | 1459 | |
| 1460 | 1460 | |
@@ -1464,8 +1464,8 @@ discard block |
||
| 1464 | 1464 | * @return \EE_Registration_Payment[] |
| 1465 | 1465 | * @throws \EE_Error |
| 1466 | 1466 | */ |
| 1467 | - public function registration_payments( $query_params = array() ) { |
|
| 1468 | - return $this->get_many_related( 'Registration_Payment', $query_params ); |
|
| 1467 | + public function registration_payments($query_params = array()) { |
|
| 1468 | + return $this->get_many_related('Registration_Payment', $query_params); |
|
| 1469 | 1469 | } |
| 1470 | 1470 | |
| 1471 | 1471 | |
@@ -1478,7 +1478,7 @@ discard block |
||
| 1478 | 1478 | * @return EE_Payment_Method|null |
| 1479 | 1479 | */ |
| 1480 | 1480 | public function payment_method() { |
| 1481 | - return EEM_Payment_Method::instance()->get_last_used_for_registration( $this ); |
|
| 1481 | + return EEM_Payment_Method::instance()->get_last_used_for_registration($this); |
|
| 1482 | 1482 | } |
| 1483 | 1483 | |
| 1484 | 1484 | |
@@ -1525,7 +1525,7 @@ discard block |
||
| 1525 | 1525 | */ |
| 1526 | 1526 | public function delete() |
| 1527 | 1527 | { |
| 1528 | - if($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) { |
|
| 1528 | + if ($this->update_extra_meta(EE_Registration::PRE_TRASH_REG_STATUS_KEY, $this->status_ID()) === true) { |
|
| 1529 | 1529 | $this->set_status(EEM_Registration::status_id_cancelled); |
| 1530 | 1530 | } |
| 1531 | 1531 | return parent::delete(); |
@@ -1,6 +1,6 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | if (! defined('EVENT_ESPRESSO_VERSION')) { |
| 3 | - exit('NO direct script access allowed'); |
|
| 3 | + exit('NO direct script access allowed'); |
|
| 4 | 4 | } |
| 5 | 5 | |
| 6 | 6 | |
@@ -27,838 +27,838 @@ discard block |
||
| 27 | 27 | class Payments_Admin_Page extends EE_Admin_Page |
| 28 | 28 | { |
| 29 | 29 | |
| 30 | - /** |
|
| 31 | - * Variables used for when we're re-sorting the logs results, in case |
|
| 32 | - * we needed to do two queries and we need to resort |
|
| 33 | - * |
|
| 34 | - * @var string |
|
| 35 | - */ |
|
| 36 | - private $_sort_logs_again_direction; |
|
| 37 | - |
|
| 38 | - |
|
| 39 | - |
|
| 40 | - /** |
|
| 41 | - * @Constructor |
|
| 42 | - * @access public |
|
| 43 | - * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object. |
|
| 44 | - * @return \Payments_Admin_Page |
|
| 45 | - */ |
|
| 46 | - public function __construct($routing = true) |
|
| 47 | - { |
|
| 48 | - parent::__construct($routing); |
|
| 49 | - } |
|
| 50 | - |
|
| 51 | - |
|
| 52 | - |
|
| 53 | - protected function _init_page_props() |
|
| 54 | - { |
|
| 55 | - $this->page_slug = EE_PAYMENTS_PG_SLUG; |
|
| 56 | - $this->page_label = __('Payment Methods', 'event_espresso'); |
|
| 57 | - $this->_admin_base_url = EE_PAYMENTS_ADMIN_URL; |
|
| 58 | - $this->_admin_base_path = EE_PAYMENTS_ADMIN; |
|
| 59 | - } |
|
| 60 | - |
|
| 61 | - |
|
| 62 | - |
|
| 63 | - protected function _ajax_hooks() |
|
| 64 | - { |
|
| 65 | - //todo: all hooks for ajax goes here. |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - |
|
| 69 | - |
|
| 70 | - protected function _define_page_props() |
|
| 71 | - { |
|
| 72 | - $this->_admin_page_title = $this->page_label; |
|
| 73 | - $this->_labels = array( |
|
| 74 | - 'publishbox' => __('Update Settings', 'event_espresso'), |
|
| 75 | - ); |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - |
|
| 79 | - |
|
| 80 | - protected function _set_page_routes() |
|
| 81 | - { |
|
| 82 | - /** |
|
| 83 | - * note that with payment method capabilities, although we've implemented |
|
| 84 | - * capability mapping which will be used for accessing payment methods owned by |
|
| 85 | - * other users. This is not fully implemented yet in the payment method ui. |
|
| 86 | - * Currently only the "plural" caps are in active use. |
|
| 87 | - * When cap mapping is implemented, some routes will need to use the singular form of |
|
| 88 | - * capability method and also include the $id of the payment method for the route. |
|
| 89 | - **/ |
|
| 90 | - $this->_page_routes = array( |
|
| 91 | - 'default' => array( |
|
| 92 | - 'func' => '_payment_methods_list', |
|
| 93 | - 'capability' => 'ee_edit_payment_methods', |
|
| 94 | - ), |
|
| 95 | - 'payment_settings' => array( |
|
| 96 | - 'func' => '_payment_settings', |
|
| 97 | - 'capability' => 'ee_manage_gateways', |
|
| 98 | - ), |
|
| 99 | - 'activate_payment_method' => array( |
|
| 100 | - 'func' => '_activate_payment_method', |
|
| 101 | - 'noheader' => true, |
|
| 102 | - 'capability' => 'ee_edit_payment_methods', |
|
| 103 | - ), |
|
| 104 | - 'deactivate_payment_method' => array( |
|
| 105 | - 'func' => '_deactivate_payment_method', |
|
| 106 | - 'noheader' => true, |
|
| 107 | - 'capability' => 'ee_delete_payment_methods', |
|
| 108 | - ), |
|
| 109 | - 'update_payment_method' => array( |
|
| 110 | - 'func' => '_update_payment_method', |
|
| 111 | - 'noheader' => true, |
|
| 112 | - 'headers_sent_route' => 'default', |
|
| 113 | - 'capability' => 'ee_edit_payment_methods', |
|
| 114 | - ), |
|
| 115 | - 'update_payment_settings' => array( |
|
| 116 | - 'func' => '_update_payment_settings', |
|
| 117 | - 'noheader' => true, |
|
| 118 | - 'capability' => 'ee_manage_gateways', |
|
| 119 | - ), |
|
| 120 | - 'payment_log' => array( |
|
| 121 | - 'func' => '_payment_log_overview_list_table', |
|
| 122 | - 'capability' => 'ee_read_payment_methods', |
|
| 123 | - ), |
|
| 124 | - 'payment_log_details' => array( |
|
| 125 | - 'func' => '_payment_log_details', |
|
| 126 | - 'capability' => 'ee_read_payment_methods', |
|
| 127 | - ), |
|
| 128 | - ); |
|
| 129 | - } |
|
| 130 | - |
|
| 131 | - |
|
| 132 | - |
|
| 133 | - protected function _set_page_config() |
|
| 134 | - { |
|
| 135 | - $payment_method_list_config = array( |
|
| 136 | - 'nav' => array( |
|
| 137 | - 'label' => __('Payment Methods', 'event_espresso'), |
|
| 138 | - 'order' => 10, |
|
| 139 | - ), |
|
| 140 | - 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 141 | - 'help_tabs' => array_merge( |
|
| 142 | - array( |
|
| 143 | - 'payment_methods_overview_help_tab' => array( |
|
| 144 | - 'title' => __('Payment Methods Overview', 'event_espresso'), |
|
| 145 | - 'filename' => 'payment_methods_overview', |
|
| 146 | - ), |
|
| 147 | - ), |
|
| 148 | - $this->_add_payment_method_help_tabs()), |
|
| 149 | - 'help_tour' => array('Payment_Methods_Selection_Help_Tour'), |
|
| 150 | - 'require_nonce' => false, |
|
| 151 | - ); |
|
| 152 | - $this->_page_config = array( |
|
| 153 | - 'default' => $payment_method_list_config, |
|
| 154 | - 'payment_settings' => array( |
|
| 155 | - 'nav' => array( |
|
| 156 | - 'label' => __('Settings', 'event_espresso'), |
|
| 157 | - 'order' => 20, |
|
| 158 | - ), |
|
| 159 | - 'help_tabs' => array( |
|
| 160 | - 'payment_methods_settings_help_tab' => array( |
|
| 161 | - 'title' => __('Payment Method Settings', 'event_espresso'), |
|
| 162 | - 'filename' => 'payment_methods_settings', |
|
| 163 | - ), |
|
| 164 | - ), |
|
| 165 | - //'help_tour' => array( 'Payment_Methods_Settings_Help_Tour' ), |
|
| 166 | - 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
| 167 | - 'require_nonce' => false, |
|
| 168 | - ), |
|
| 169 | - 'payment_log' => array( |
|
| 170 | - 'nav' => array( |
|
| 171 | - 'label' => __("Logs", 'event_espresso'), |
|
| 172 | - 'order' => 30, |
|
| 173 | - ), |
|
| 174 | - 'list_table' => 'Payment_Log_Admin_List_Table', |
|
| 175 | - 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 176 | - 'require_nonce' => false, |
|
| 177 | - ), |
|
| 178 | - ); |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - |
|
| 182 | - |
|
| 183 | - /** |
|
| 184 | - * @return array |
|
| 185 | - */ |
|
| 186 | - protected function _add_payment_method_help_tabs() |
|
| 187 | - { |
|
| 188 | - EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 189 | - $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types(); |
|
| 190 | - $all_pmt_help_tabs_config = array(); |
|
| 191 | - foreach ($payment_method_types as $payment_method_type) { |
|
| 192 | - if (! EE_Registry::instance()->CAP->current_user_can($payment_method_type->cap_name(), |
|
| 193 | - 'specific_payment_method_type_access') |
|
| 194 | - ) { |
|
| 195 | - continue; |
|
| 196 | - } |
|
| 197 | - foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) { |
|
| 198 | - $template_args = isset($config['template_args']) ? $config['template_args'] : array(); |
|
| 199 | - $template_args['admin_page_obj'] = $this; |
|
| 200 | - $all_pmt_help_tabs_config[$help_tab_name] = array( |
|
| 201 | - 'title' => $config['title'], |
|
| 202 | - 'content' => EEH_Template::display_template( |
|
| 203 | - $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php', |
|
| 204 | - $template_args, |
|
| 205 | - true), |
|
| 206 | - ); |
|
| 207 | - } |
|
| 208 | - } |
|
| 209 | - return $all_pmt_help_tabs_config; |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - |
|
| 213 | - |
|
| 214 | - //none of the below group are currently used for Gateway Settings |
|
| 215 | - protected function _add_screen_options() |
|
| 216 | - { |
|
| 217 | - } |
|
| 218 | - |
|
| 219 | - |
|
| 220 | - |
|
| 221 | - protected function _add_feature_pointers() |
|
| 222 | - { |
|
| 223 | - } |
|
| 224 | - |
|
| 225 | - |
|
| 226 | - |
|
| 227 | - public function admin_init() |
|
| 228 | - { |
|
| 229 | - } |
|
| 230 | - |
|
| 231 | - |
|
| 232 | - |
|
| 233 | - public function admin_notices() |
|
| 234 | - { |
|
| 235 | - } |
|
| 236 | - |
|
| 237 | - |
|
| 238 | - |
|
| 239 | - public function admin_footer_scripts() |
|
| 240 | - { |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - |
|
| 244 | - |
|
| 245 | - public function load_scripts_styles() |
|
| 246 | - { |
|
| 247 | - wp_enqueue_script('ee_admin_js'); |
|
| 248 | - wp_enqueue_script('ee-text-links'); |
|
| 249 | - wp_enqueue_script('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js', |
|
| 250 | - array('espresso-ui-theme', 'ee-datepicker'), EVENT_ESPRESSO_VERSION, true); |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - |
|
| 254 | - |
|
| 255 | - public function load_scripts_styles_default() |
|
| 256 | - { |
|
| 257 | - //styles |
|
| 258 | - wp_register_style('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'ee-payments.css', array(), |
|
| 259 | - EVENT_ESPRESSO_VERSION); |
|
| 260 | - wp_enqueue_style('espresso_payments'); |
|
| 261 | - wp_enqueue_style('ee-text-links'); |
|
| 262 | - //scripts |
|
| 263 | - } |
|
| 264 | - |
|
| 265 | - |
|
| 266 | - |
|
| 267 | - protected function _payment_methods_list() |
|
| 268 | - { |
|
| 269 | - /** |
|
| 270 | - * first let's ensure payment methods have been setup. We do this here because when people activate a |
|
| 271 | - * payment method for the first time (as an addon), it may not setup its capabilities or get registered correctly due |
|
| 272 | - * to the loading process. However, people MUST setup the details for the payment method so its safe to do a |
|
| 273 | - * recheck here. |
|
| 274 | - */ |
|
| 275 | - EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 276 | - EEM_Payment_Method::instance()->verify_button_urls(); |
|
| 277 | - //setup tabs, one for each payment method type |
|
| 278 | - $tabs = array(); |
|
| 279 | - $payment_methods = array(); |
|
| 280 | - foreach (EE_Payment_Method_Manager::instance()->payment_method_types() as $pmt_obj) { |
|
| 281 | - // we don't want to show admin-only PMTs for now |
|
| 282 | - if ($pmt_obj instanceof EE_PMT_Admin_Only) { |
|
| 283 | - continue; |
|
| 284 | - } |
|
| 285 | - //check access |
|
| 286 | - if (! EE_Registry::instance()->CAP->current_user_can($pmt_obj->cap_name(), |
|
| 287 | - 'specific_payment_method_type_access') |
|
| 288 | - ) { |
|
| 289 | - continue; |
|
| 290 | - } |
|
| 291 | - //check for any active pms of that type |
|
| 292 | - $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name()); |
|
| 293 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 294 | - $payment_method = EE_Payment_Method::new_instance( |
|
| 295 | - array( |
|
| 296 | - 'PMD_slug' => sanitize_key($pmt_obj->system_name()), |
|
| 297 | - 'PMD_type' => $pmt_obj->system_name(), |
|
| 298 | - 'PMD_name' => $pmt_obj->pretty_name(), |
|
| 299 | - 'PMD_admin_name' => $pmt_obj->pretty_name(), |
|
| 300 | - ) |
|
| 301 | - ); |
|
| 302 | - } |
|
| 303 | - $payment_methods[$payment_method->slug()] = $payment_method; |
|
| 304 | - } |
|
| 305 | - $payment_methods = apply_filters('FHEE__Payments_Admin_Page___payment_methods_list__payment_methods', |
|
| 306 | - $payment_methods); |
|
| 307 | - foreach ($payment_methods as $payment_method) { |
|
| 308 | - if ($payment_method instanceof EE_Payment_Method) { |
|
| 309 | - add_meta_box( |
|
| 310 | - //html id |
|
| 311 | - 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 312 | - //title |
|
| 313 | - sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()), |
|
| 314 | - //callback |
|
| 315 | - array($this, 'payment_method_settings_meta_box'), |
|
| 316 | - //post type |
|
| 317 | - null, |
|
| 318 | - //context |
|
| 319 | - 'normal', |
|
| 320 | - //priority |
|
| 321 | - 'default', |
|
| 322 | - //callback args |
|
| 323 | - array('payment_method' => $payment_method) |
|
| 324 | - ); |
|
| 325 | - //setup for tabbed content |
|
| 326 | - $tabs[$payment_method->slug()] = array( |
|
| 327 | - 'label' => $payment_method->admin_name(), |
|
| 328 | - 'class' => $payment_method->active() ? 'gateway-active' : '', |
|
| 329 | - 'href' => 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 330 | - 'title' => __('Modify this Payment Method', 'event_espresso'), |
|
| 331 | - 'slug' => $payment_method->slug(), |
|
| 332 | - ); |
|
| 333 | - } |
|
| 334 | - } |
|
| 335 | - $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links($tabs, 'payment_method_links', |
|
| 336 | - '|', $this->_get_active_payment_method_slug()); |
|
| 337 | - $this->display_admin_page_with_sidebar(); |
|
| 338 | - } |
|
| 339 | - |
|
| 340 | - |
|
| 341 | - |
|
| 342 | - /** |
|
| 343 | - * _get_active_payment_method_slug |
|
| 344 | - * |
|
| 345 | - * @return string |
|
| 346 | - */ |
|
| 347 | - protected function _get_active_payment_method_slug() |
|
| 348 | - { |
|
| 349 | - $payment_method_slug = false; |
|
| 350 | - //decide which payment method tab to open first, as dictated by the request's 'payment_method' |
|
| 351 | - if (isset($this->_req_data['payment_method'])) { |
|
| 352 | - // if they provided the current payment method, use it |
|
| 353 | - $payment_method_slug = sanitize_key($this->_req_data['payment_method']); |
|
| 354 | - } |
|
| 355 | - $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug))); |
|
| 356 | - // if that didn't work or wasn't provided, find another way to select the current pm |
|
| 357 | - if (! $this->_verify_payment_method($payment_method)) { |
|
| 358 | - // like, looking for an active one |
|
| 359 | - $payment_method = EEM_Payment_Method::instance()->get_one_active('CART'); |
|
| 360 | - // test that one as well |
|
| 361 | - if ($this->_verify_payment_method($payment_method)) { |
|
| 362 | - $payment_method_slug = $payment_method->slug(); |
|
| 363 | - } else { |
|
| 364 | - $payment_method_slug = 'paypal_standard'; |
|
| 365 | - } |
|
| 366 | - } |
|
| 367 | - return $payment_method_slug; |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - |
|
| 371 | - |
|
| 372 | - /** |
|
| 373 | - * payment_method_settings_meta_box |
|
| 374 | - * returns TRUE if the passed payment method is properly constructed and the logged in user has the correct |
|
| 375 | - * capabilities to access it |
|
| 376 | - * |
|
| 377 | - * @param \EE_Payment_Method $payment_method |
|
| 378 | - * @return boolean |
|
| 379 | - */ |
|
| 380 | - protected function _verify_payment_method($payment_method) |
|
| 381 | - { |
|
| 382 | - if ( |
|
| 383 | - $payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base |
|
| 384 | - && EE_Registry::instance()->CAP->current_user_can($payment_method->type_obj()->cap_name(), |
|
| 385 | - 'specific_payment_method_type_access') |
|
| 386 | - ) { |
|
| 387 | - return true; |
|
| 388 | - } |
|
| 389 | - return false; |
|
| 390 | - } |
|
| 391 | - |
|
| 392 | - |
|
| 393 | - |
|
| 394 | - /** |
|
| 395 | - * payment_method_settings_meta_box |
|
| 396 | - * |
|
| 397 | - * @param NULL $post_obj_which_is_null is an object containing the current post (as a $post object) |
|
| 398 | - * @param array $metabox is an array with metabox id, title, callback, and args elements. the value |
|
| 399 | - * at 'args' has key 'payment_method', as set within _payment_methods_list |
|
| 400 | - * @return string |
|
| 401 | - * @throws EE_Error |
|
| 402 | - */ |
|
| 403 | - public function payment_method_settings_meta_box($post_obj_which_is_null, $metabox) |
|
| 404 | - { |
|
| 405 | - $payment_method = isset($metabox['args'], $metabox['args']['payment_method']) |
|
| 406 | - ? $metabox['args']['payment_method'] : null; |
|
| 407 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 408 | - throw new EE_Error(sprintf(__('Payment method metabox setup incorrectly. No Payment method object was supplied', |
|
| 409 | - 'event_espresso'))); |
|
| 410 | - } |
|
| 411 | - $payment_method_scopes = $payment_method->active(); |
|
| 412 | - // if the payment method really exists show its form, otherwise the activation template |
|
| 413 | - if ($payment_method->ID() && ! empty($payment_method_scopes)) { |
|
| 414 | - $form = $this->_generate_payment_method_settings_form($payment_method); |
|
| 415 | - if ($form->form_data_present_in($this->_req_data)) { |
|
| 416 | - $form->receive_form_submission($this->_req_data); |
|
| 417 | - } |
|
| 418 | - echo $form->form_open() . $form->get_html_and_js() . $form->form_close(); |
|
| 419 | - } else { |
|
| 420 | - echo $this->_activate_payment_method_button($payment_method)->get_html_and_js(); |
|
| 421 | - } |
|
| 422 | - } |
|
| 423 | - |
|
| 424 | - |
|
| 425 | - |
|
| 426 | - /** |
|
| 427 | - * Gets the form for all the settings related to this payment method type |
|
| 428 | - * |
|
| 429 | - * @access protected |
|
| 430 | - * @param \EE_Payment_Method $payment_method |
|
| 431 | - * @return \EE_Form_Section_Proper |
|
| 432 | - */ |
|
| 433 | - protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method) |
|
| 434 | - { |
|
| 435 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 436 | - return new EE_Form_Section_Proper(); |
|
| 437 | - } |
|
| 438 | - return new EE_Form_Section_Proper( |
|
| 439 | - array( |
|
| 440 | - 'name' => $payment_method->slug() . '_settings_form', |
|
| 441 | - 'html_id' => $payment_method->slug() . '_settings_form', |
|
| 442 | - 'action' => EE_Admin_Page::add_query_args_and_nonce( |
|
| 443 | - array( |
|
| 444 | - 'action' => 'update_payment_method', |
|
| 445 | - 'payment_method' => $payment_method->slug(), |
|
| 446 | - ), |
|
| 447 | - EE_PAYMENTS_ADMIN_URL |
|
| 448 | - ), |
|
| 449 | - 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 450 | - 'subsections' => apply_filters( |
|
| 451 | - 'FHEE__Payments_Admin_Page___generate_payment_method_settings_form__form_subsections', |
|
| 452 | - array( |
|
| 453 | - 'pci_dss_compliance' => $this->_pci_dss_compliance($payment_method), |
|
| 454 | - 'currency_support' => $this->_currency_support($payment_method), |
|
| 455 | - 'payment_method_settings' => $this->_payment_method_settings($payment_method), |
|
| 456 | - 'update' => $this->_update_payment_method_button($payment_method), |
|
| 457 | - 'deactivate' => $this->_deactivate_payment_method_button($payment_method), |
|
| 458 | - 'fine_print' => $this->_fine_print(), |
|
| 459 | - ), |
|
| 460 | - $payment_method |
|
| 461 | - ), |
|
| 462 | - ) |
|
| 463 | - ); |
|
| 464 | - } |
|
| 465 | - |
|
| 466 | - |
|
| 467 | - |
|
| 468 | - /** |
|
| 469 | - * _pci_dss_compliance |
|
| 470 | - * |
|
| 471 | - * @access protected |
|
| 472 | - * @param \EE_Payment_Method $payment_method |
|
| 473 | - * @return \EE_Form_Section_Proper |
|
| 474 | - */ |
|
| 475 | - protected function _pci_dss_compliance(EE_Payment_Method $payment_method) |
|
| 476 | - { |
|
| 477 | - if ($payment_method->type_obj()->requires_https()) { |
|
| 478 | - return new EE_Form_Section_HTML( |
|
| 479 | - EEH_HTML::tr( |
|
| 480 | - EEH_HTML::th( |
|
| 481 | - EEH_HTML::label( |
|
| 482 | - EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
|
| 483 | - ) |
|
| 484 | - ) . |
|
| 485 | - EEH_HTML::td( |
|
| 486 | - EEH_HTML::strong(__('You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.', |
|
| 487 | - 'event_espresso')) |
|
| 488 | - . |
|
| 489 | - EEH_HTML::br() |
|
| 490 | - . |
|
| 491 | - __('Learn more about ', 'event_espresso') |
|
| 492 | - . EEH_HTML::link('https://www.pcisecuritystandards.org/merchants/index.php', |
|
| 493 | - __('PCI DSS compliance', 'event_espresso')) |
|
| 494 | - ) |
|
| 495 | - ) |
|
| 496 | - ); |
|
| 497 | - } else { |
|
| 498 | - return new EE_Form_Section_HTML(''); |
|
| 499 | - } |
|
| 500 | - } |
|
| 501 | - |
|
| 502 | - |
|
| 503 | - |
|
| 504 | - /** |
|
| 505 | - * _currency_support |
|
| 506 | - * |
|
| 507 | - * @access protected |
|
| 508 | - * @param \EE_Payment_Method $payment_method |
|
| 509 | - * @return \EE_Form_Section_Proper |
|
| 510 | - */ |
|
| 511 | - protected function _currency_support(EE_Payment_Method $payment_method) |
|
| 512 | - { |
|
| 513 | - if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) { |
|
| 514 | - return new EE_Form_Section_HTML( |
|
| 515 | - EEH_HTML::tr( |
|
| 516 | - EEH_HTML::th( |
|
| 517 | - EEH_HTML::label( |
|
| 518 | - EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
|
| 519 | - ) |
|
| 520 | - ) . |
|
| 521 | - EEH_HTML::td( |
|
| 522 | - EEH_HTML::strong( |
|
| 523 | - sprintf( |
|
| 524 | - __('This payment method does not support the currency set on your site (%1$s). Please activate a different payment method or change your site\'s country and associated currency.', |
|
| 525 | - 'event_espresso'), |
|
| 526 | - EE_Config::instance()->currency->code |
|
| 527 | - ) |
|
| 528 | - ) |
|
| 529 | - ) |
|
| 530 | - ) |
|
| 531 | - ); |
|
| 532 | - } else { |
|
| 533 | - return new EE_Form_Section_HTML(''); |
|
| 534 | - } |
|
| 535 | - } |
|
| 536 | - |
|
| 537 | - |
|
| 538 | - |
|
| 539 | - /** |
|
| 540 | - * _update_payment_method_button |
|
| 541 | - * |
|
| 542 | - * @access protected |
|
| 543 | - * @param \EE_Payment_Method $payment_method |
|
| 544 | - * @return \EE_Form_Section_HTML |
|
| 545 | - */ |
|
| 546 | - protected function _payment_method_settings(EE_Payment_Method $payment_method) |
|
| 547 | - { |
|
| 548 | - //modify the form so we only have/show fields that will be implemented for this version |
|
| 549 | - return $this->_simplify_form($payment_method->type_obj()->settings_form(), $payment_method->name()); |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - |
|
| 553 | - |
|
| 554 | - /** |
|
| 555 | - * Simplifies the form to merely reproduce 4.1's gateway settings functionality |
|
| 556 | - * |
|
| 557 | - * @param EE_Form_Section_Proper $form_section |
|
| 558 | - * @param string $payment_method_name |
|
| 559 | - * @return \EE_Payment_Method_Form |
|
| 560 | - * @throws \EE_Error |
|
| 561 | - */ |
|
| 562 | - protected function _simplify_form($form_section, $payment_method_name = '') |
|
| 563 | - { |
|
| 564 | - if ($form_section instanceof EE_Payment_Method_Form) { |
|
| 565 | - $form_section->exclude( |
|
| 566 | - array( |
|
| 567 | - 'PMD_type', //dont want them changing the type |
|
| 568 | - 'PMD_slug', //or the slug (probably never) |
|
| 569 | - 'PMD_wp_user', //or the user's ID |
|
| 570 | - 'Currency' //or the currency, until the rest of EE supports simultaneous currencies |
|
| 571 | - ) |
|
| 572 | - ); |
|
| 573 | - return $form_section; |
|
| 574 | - } else { |
|
| 575 | - throw new EE_Error(sprintf(__('The EE_Payment_Method_Form for the "%1$s" payment method is missing or invalid.', |
|
| 576 | - 'event_espresso'), $payment_method_name)); |
|
| 577 | - } |
|
| 578 | - } |
|
| 579 | - |
|
| 580 | - |
|
| 581 | - |
|
| 582 | - /** |
|
| 583 | - * _update_payment_method_button |
|
| 584 | - * |
|
| 585 | - * @access protected |
|
| 586 | - * @param \EE_Payment_Method $payment_method |
|
| 587 | - * @return \EE_Form_Section_HTML |
|
| 588 | - */ |
|
| 589 | - protected function _update_payment_method_button(EE_Payment_Method $payment_method) |
|
| 590 | - { |
|
| 591 | - $update_button = new EE_Submit_Input( |
|
| 592 | - array( |
|
| 593 | - 'name' => 'submit', |
|
| 594 | - 'html_id' => 'save_' . $payment_method->slug() . '_settings', |
|
| 595 | - 'default' => sprintf(__('Update %s Payment Settings', 'event_espresso'), |
|
| 596 | - $payment_method->admin_name()), |
|
| 597 | - 'html_label' => EEH_HTML::nbsp(), |
|
| 598 | - ) |
|
| 599 | - ); |
|
| 600 | - return new EE_Form_Section_HTML( |
|
| 601 | - EEH_HTML::no_row(EEH_HTML::br(2)) . |
|
| 602 | - EEH_HTML::tr( |
|
| 603 | - EEH_HTML::th(__('Update Settings', 'event_espresso')) . |
|
| 604 | - EEH_HTML::td( |
|
| 605 | - $update_button->get_html_for_input() |
|
| 606 | - ) |
|
| 607 | - ) |
|
| 608 | - ); |
|
| 609 | - } |
|
| 610 | - |
|
| 611 | - |
|
| 612 | - |
|
| 613 | - /** |
|
| 614 | - * _deactivate_payment_method_button |
|
| 615 | - * |
|
| 616 | - * @access protected |
|
| 617 | - * @param \EE_Payment_Method $payment_method |
|
| 618 | - * @return \EE_Form_Section_Proper |
|
| 619 | - */ |
|
| 620 | - protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method) |
|
| 621 | - { |
|
| 622 | - $link_text_and_title = sprintf(__('Deactivate %1$s Payments?', 'event_espresso'), |
|
| 623 | - $payment_method->admin_name()); |
|
| 624 | - return new EE_Form_Section_HTML( |
|
| 625 | - EEH_HTML::tr( |
|
| 626 | - EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) . |
|
| 627 | - EEH_HTML::td( |
|
| 628 | - EEH_HTML::link( |
|
| 629 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 630 | - array( |
|
| 631 | - 'action' => 'deactivate_payment_method', |
|
| 632 | - 'payment_method' => $payment_method->slug(), |
|
| 633 | - ), |
|
| 634 | - EE_PAYMENTS_ADMIN_URL |
|
| 635 | - ), |
|
| 636 | - $link_text_and_title, |
|
| 637 | - $link_text_and_title, |
|
| 638 | - 'deactivate_' . $payment_method->slug(), |
|
| 639 | - 'espresso-button button-secondary' |
|
| 640 | - ) |
|
| 641 | - ) |
|
| 642 | - ) |
|
| 643 | - ); |
|
| 644 | - } |
|
| 645 | - |
|
| 646 | - |
|
| 647 | - |
|
| 648 | - /** |
|
| 649 | - * _activate_payment_method_button |
|
| 650 | - * |
|
| 651 | - * @access protected |
|
| 652 | - * @param \EE_Payment_Method $payment_method |
|
| 653 | - * @return \EE_Form_Section_Proper |
|
| 654 | - */ |
|
| 655 | - protected function _activate_payment_method_button(EE_Payment_Method $payment_method) |
|
| 656 | - { |
|
| 657 | - $link_text_and_title = sprintf(__('Activate %1$s Payment Method?', 'event_espresso'), |
|
| 658 | - $payment_method->admin_name()); |
|
| 659 | - return new EE_Form_Section_Proper( |
|
| 660 | - array( |
|
| 661 | - 'name' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 662 | - 'html_id' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 663 | - 'action' => '#', |
|
| 664 | - 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 665 | - 'subsections' => apply_filters( |
|
| 666 | - 'FHEE__Payments_Admin_Page___activate_payment_method_button__form_subsections', |
|
| 667 | - array( |
|
| 668 | - new EE_Form_Section_HTML( |
|
| 669 | - EEH_HTML::tr( |
|
| 670 | - EEH_HTML::td($payment_method->type_obj()->introductory_html(), |
|
| 671 | - '', |
|
| 672 | - '', |
|
| 673 | - '', |
|
| 674 | - 'colspan="2"' |
|
| 675 | - ) |
|
| 676 | - ) . |
|
| 677 | - EEH_HTML::tr( |
|
| 678 | - EEH_HTML::th( |
|
| 679 | - EEH_HTML::label(__('Click to Activate ', 'event_espresso')) |
|
| 680 | - ) . |
|
| 681 | - EEH_HTML::td( |
|
| 682 | - EEH_HTML::link( |
|
| 683 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 684 | - array( |
|
| 685 | - 'action' => 'activate_payment_method', |
|
| 686 | - 'payment_method_type' => $payment_method->type(), |
|
| 687 | - ), |
|
| 688 | - EE_PAYMENTS_ADMIN_URL |
|
| 689 | - ), |
|
| 690 | - $link_text_and_title, |
|
| 691 | - $link_text_and_title, |
|
| 692 | - 'activate_' . $payment_method->slug(), |
|
| 693 | - 'espresso-button-green button-primary' |
|
| 694 | - ) |
|
| 695 | - ) |
|
| 696 | - ) |
|
| 697 | - ), |
|
| 698 | - ), |
|
| 699 | - $payment_method |
|
| 700 | - ), |
|
| 701 | - ) |
|
| 702 | - ); |
|
| 703 | - } |
|
| 704 | - |
|
| 705 | - |
|
| 706 | - |
|
| 707 | - /** |
|
| 708 | - * _fine_print |
|
| 709 | - * |
|
| 710 | - * @access protected |
|
| 711 | - * @return \EE_Form_Section_HTML |
|
| 712 | - */ |
|
| 713 | - protected function _fine_print() |
|
| 714 | - { |
|
| 715 | - return new EE_Form_Section_HTML( |
|
| 716 | - EEH_HTML::tr( |
|
| 717 | - EEH_HTML::th() . |
|
| 718 | - EEH_HTML::td( |
|
| 719 | - EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text') |
|
| 720 | - ) |
|
| 721 | - ) |
|
| 722 | - ); |
|
| 723 | - } |
|
| 724 | - |
|
| 725 | - |
|
| 726 | - |
|
| 727 | - /** |
|
| 728 | - * Activates a payment method of that type. Mostly assuming there is only 1 of that type (or none so far) |
|
| 729 | - * |
|
| 730 | - * @global WP_User $current_user |
|
| 731 | - */ |
|
| 732 | - protected function _activate_payment_method() |
|
| 733 | - { |
|
| 734 | - if (isset($this->_req_data['payment_method_type'])) { |
|
| 735 | - $payment_method_type = sanitize_text_field($this->_req_data['payment_method_type']); |
|
| 736 | - //see if one exists |
|
| 737 | - EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 738 | - $payment_method = EE_Payment_Method_Manager::instance() |
|
| 739 | - ->activate_a_payment_method_of_type($payment_method_type); |
|
| 740 | - $this->_redirect_after_action(1, 'Payment Method', 'activated', |
|
| 741 | - array('action' => 'default', 'payment_method' => $payment_method->slug())); |
|
| 742 | - } else { |
|
| 743 | - $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default')); |
|
| 744 | - } |
|
| 745 | - } |
|
| 746 | - |
|
| 747 | - |
|
| 748 | - |
|
| 749 | - /** |
|
| 750 | - * Deactivates the payment method with the specified slug, and redirects. |
|
| 751 | - */ |
|
| 752 | - protected function _deactivate_payment_method() |
|
| 753 | - { |
|
| 754 | - if (isset($this->_req_data['payment_method'])) { |
|
| 755 | - $payment_method_slug = sanitize_key($this->_req_data['payment_method']); |
|
| 756 | - //deactivate it |
|
| 757 | - EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 758 | - $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method($payment_method_slug); |
|
| 759 | - $this->_redirect_after_action($count_updated, 'Payment Method', 'deactivated', |
|
| 760 | - array('action' => 'default', 'payment_method' => $payment_method_slug)); |
|
| 761 | - } else { |
|
| 762 | - $this->_redirect_after_action(false, 'Payment Method', 'deactivated', array('action' => 'default')); |
|
| 763 | - } |
|
| 764 | - } |
|
| 765 | - |
|
| 766 | - |
|
| 767 | - |
|
| 768 | - /** |
|
| 769 | - * Processes the payment method form that was submitted. This is slightly trickier than usual form |
|
| 770 | - * processing because we first need to identify WHICH form was processed and which payment method |
|
| 771 | - * it corresponds to. Once we have done that, we see if the form is valid. If it is, the |
|
| 772 | - * form's data is saved and we redirect to the default payment methods page, setting the updated payment method |
|
| 773 | - * as the currently-selected one. If it DOESN'T validate, we render the page with the form's errors (in the |
|
| 774 | - * subsequently called 'headers_sent_func' which is _payment_methods_list) |
|
| 775 | - * |
|
| 776 | - * @return void |
|
| 777 | - */ |
|
| 778 | - protected function _update_payment_method() |
|
| 779 | - { |
|
| 780 | - if ($_SERVER['REQUEST_METHOD'] == 'POST') { |
|
| 781 | - //ok let's find which gateway form to use based on the form input |
|
| 782 | - EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 783 | - /** @var $correct_pmt_form_to_use EE_Payment_Method_Form */ |
|
| 784 | - $correct_pmt_form_to_use = null; |
|
| 785 | - $payment_method = null; |
|
| 786 | - foreach (EEM_Payment_Method::instance()->get_all() as $payment_method) { |
|
| 787 | - //get the form and simplify it, like what we do when we display it |
|
| 788 | - $pmt_form = $this->_generate_payment_method_settings_form($payment_method); |
|
| 789 | - if ($pmt_form->form_data_present_in($this->_req_data)) { |
|
| 790 | - $correct_pmt_form_to_use = $pmt_form; |
|
| 791 | - break; |
|
| 792 | - } |
|
| 793 | - } |
|
| 794 | - //if we couldn't find the correct payment method type... |
|
| 795 | - if (! $correct_pmt_form_to_use) { |
|
| 796 | - EE_Error::add_error(__("We could not find which payment method type your form submission related to. Please contact support", |
|
| 797 | - 'event_espresso'), __FILE__, __FUNCTION__, __LINE__); |
|
| 798 | - $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default')); |
|
| 799 | - } |
|
| 800 | - $correct_pmt_form_to_use->receive_form_submission($this->_req_data); |
|
| 801 | - if ($correct_pmt_form_to_use->is_valid()) { |
|
| 802 | - $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings'); |
|
| 803 | - if (! $payment_settings_subform instanceof EE_Payment_Method_Form) { |
|
| 804 | - throw new EE_Error( |
|
| 805 | - sprintf( |
|
| 806 | - __('The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.', |
|
| 807 | - 'event_espresso'), |
|
| 808 | - 'payment_method_settings' |
|
| 809 | - ) |
|
| 810 | - ); |
|
| 811 | - } |
|
| 812 | - $payment_settings_subform->save(); |
|
| 813 | - /** @var $pm EE_Payment_Method */ |
|
| 814 | - $this->_redirect_after_action(true, 'Payment Method', 'updated', |
|
| 815 | - array('action' => 'default', 'payment_method' => $payment_method->slug())); |
|
| 816 | - } else { |
|
| 817 | - EE_Error::add_error( |
|
| 818 | - sprintf( |
|
| 819 | - __('Payment method of type %s was not saved because there were validation errors. They have been marked in the form', |
|
| 820 | - 'event_espresso'), |
|
| 821 | - $payment_method instanceof EE_PMT_Base ? $payment_method->pretty_name() |
|
| 822 | - : __('"(unknown)"', 'event_espresso') |
|
| 823 | - ), |
|
| 824 | - __FILE__, |
|
| 825 | - __FUNCTION__, |
|
| 826 | - __LINE__ |
|
| 827 | - ); |
|
| 828 | - } |
|
| 829 | - } |
|
| 830 | - return; |
|
| 831 | - } |
|
| 832 | - |
|
| 833 | - |
|
| 834 | - |
|
| 835 | - protected function _payment_settings() |
|
| 836 | - { |
|
| 837 | - $this->_template_args['values'] = $this->_yes_no_values; |
|
| 838 | - $this->_template_args['show_pending_payment_options'] = isset(EE_Registry::instance()->CFG->registration->show_pending_payment_options) |
|
| 839 | - ? absint(EE_Registry::instance()->CFG->registration->show_pending_payment_options) : false; |
|
| 840 | - $this->_set_add_edit_form_tags('update_payment_settings'); |
|
| 841 | - $this->_set_publish_post_box_vars(null, false, false, null, false); |
|
| 842 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template(EE_PAYMENTS_TEMPLATE_PATH |
|
| 843 | - . 'payment_settings.template.php', |
|
| 844 | - $this->_template_args, true); |
|
| 845 | - $this->display_admin_page_with_sidebar(); |
|
| 846 | - } |
|
| 847 | - |
|
| 848 | - |
|
| 849 | - |
|
| 850 | - /** |
|
| 851 | - * _update_payment_settings |
|
| 852 | - * |
|
| 853 | - * @access protected |
|
| 854 | - * @return array |
|
| 855 | - */ |
|
| 856 | - protected function _update_payment_settings() |
|
| 857 | - { |
|
| 858 | - EE_Registry::instance()->CFG->registration->show_pending_payment_options = isset($this->_req_data['show_pending_payment_options']) |
|
| 859 | - ? $this->_req_data['show_pending_payment_options'] : false; |
|
| 860 | - EE_Registry::instance()->CFG = apply_filters('FHEE__Payments_Admin_Page___update_payment_settings__CFG', |
|
| 861 | - EE_Registry::instance()->CFG); |
|
| 30 | + /** |
|
| 31 | + * Variables used for when we're re-sorting the logs results, in case |
|
| 32 | + * we needed to do two queries and we need to resort |
|
| 33 | + * |
|
| 34 | + * @var string |
|
| 35 | + */ |
|
| 36 | + private $_sort_logs_again_direction; |
|
| 37 | + |
|
| 38 | + |
|
| 39 | + |
|
| 40 | + /** |
|
| 41 | + * @Constructor |
|
| 42 | + * @access public |
|
| 43 | + * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object. |
|
| 44 | + * @return \Payments_Admin_Page |
|
| 45 | + */ |
|
| 46 | + public function __construct($routing = true) |
|
| 47 | + { |
|
| 48 | + parent::__construct($routing); |
|
| 49 | + } |
|
| 50 | + |
|
| 51 | + |
|
| 52 | + |
|
| 53 | + protected function _init_page_props() |
|
| 54 | + { |
|
| 55 | + $this->page_slug = EE_PAYMENTS_PG_SLUG; |
|
| 56 | + $this->page_label = __('Payment Methods', 'event_espresso'); |
|
| 57 | + $this->_admin_base_url = EE_PAYMENTS_ADMIN_URL; |
|
| 58 | + $this->_admin_base_path = EE_PAYMENTS_ADMIN; |
|
| 59 | + } |
|
| 60 | + |
|
| 61 | + |
|
| 62 | + |
|
| 63 | + protected function _ajax_hooks() |
|
| 64 | + { |
|
| 65 | + //todo: all hooks for ajax goes here. |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + |
|
| 69 | + |
|
| 70 | + protected function _define_page_props() |
|
| 71 | + { |
|
| 72 | + $this->_admin_page_title = $this->page_label; |
|
| 73 | + $this->_labels = array( |
|
| 74 | + 'publishbox' => __('Update Settings', 'event_espresso'), |
|
| 75 | + ); |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + |
|
| 79 | + |
|
| 80 | + protected function _set_page_routes() |
|
| 81 | + { |
|
| 82 | + /** |
|
| 83 | + * note that with payment method capabilities, although we've implemented |
|
| 84 | + * capability mapping which will be used for accessing payment methods owned by |
|
| 85 | + * other users. This is not fully implemented yet in the payment method ui. |
|
| 86 | + * Currently only the "plural" caps are in active use. |
|
| 87 | + * When cap mapping is implemented, some routes will need to use the singular form of |
|
| 88 | + * capability method and also include the $id of the payment method for the route. |
|
| 89 | + **/ |
|
| 90 | + $this->_page_routes = array( |
|
| 91 | + 'default' => array( |
|
| 92 | + 'func' => '_payment_methods_list', |
|
| 93 | + 'capability' => 'ee_edit_payment_methods', |
|
| 94 | + ), |
|
| 95 | + 'payment_settings' => array( |
|
| 96 | + 'func' => '_payment_settings', |
|
| 97 | + 'capability' => 'ee_manage_gateways', |
|
| 98 | + ), |
|
| 99 | + 'activate_payment_method' => array( |
|
| 100 | + 'func' => '_activate_payment_method', |
|
| 101 | + 'noheader' => true, |
|
| 102 | + 'capability' => 'ee_edit_payment_methods', |
|
| 103 | + ), |
|
| 104 | + 'deactivate_payment_method' => array( |
|
| 105 | + 'func' => '_deactivate_payment_method', |
|
| 106 | + 'noheader' => true, |
|
| 107 | + 'capability' => 'ee_delete_payment_methods', |
|
| 108 | + ), |
|
| 109 | + 'update_payment_method' => array( |
|
| 110 | + 'func' => '_update_payment_method', |
|
| 111 | + 'noheader' => true, |
|
| 112 | + 'headers_sent_route' => 'default', |
|
| 113 | + 'capability' => 'ee_edit_payment_methods', |
|
| 114 | + ), |
|
| 115 | + 'update_payment_settings' => array( |
|
| 116 | + 'func' => '_update_payment_settings', |
|
| 117 | + 'noheader' => true, |
|
| 118 | + 'capability' => 'ee_manage_gateways', |
|
| 119 | + ), |
|
| 120 | + 'payment_log' => array( |
|
| 121 | + 'func' => '_payment_log_overview_list_table', |
|
| 122 | + 'capability' => 'ee_read_payment_methods', |
|
| 123 | + ), |
|
| 124 | + 'payment_log_details' => array( |
|
| 125 | + 'func' => '_payment_log_details', |
|
| 126 | + 'capability' => 'ee_read_payment_methods', |
|
| 127 | + ), |
|
| 128 | + ); |
|
| 129 | + } |
|
| 130 | + |
|
| 131 | + |
|
| 132 | + |
|
| 133 | + protected function _set_page_config() |
|
| 134 | + { |
|
| 135 | + $payment_method_list_config = array( |
|
| 136 | + 'nav' => array( |
|
| 137 | + 'label' => __('Payment Methods', 'event_espresso'), |
|
| 138 | + 'order' => 10, |
|
| 139 | + ), |
|
| 140 | + 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 141 | + 'help_tabs' => array_merge( |
|
| 142 | + array( |
|
| 143 | + 'payment_methods_overview_help_tab' => array( |
|
| 144 | + 'title' => __('Payment Methods Overview', 'event_espresso'), |
|
| 145 | + 'filename' => 'payment_methods_overview', |
|
| 146 | + ), |
|
| 147 | + ), |
|
| 148 | + $this->_add_payment_method_help_tabs()), |
|
| 149 | + 'help_tour' => array('Payment_Methods_Selection_Help_Tour'), |
|
| 150 | + 'require_nonce' => false, |
|
| 151 | + ); |
|
| 152 | + $this->_page_config = array( |
|
| 153 | + 'default' => $payment_method_list_config, |
|
| 154 | + 'payment_settings' => array( |
|
| 155 | + 'nav' => array( |
|
| 156 | + 'label' => __('Settings', 'event_espresso'), |
|
| 157 | + 'order' => 20, |
|
| 158 | + ), |
|
| 159 | + 'help_tabs' => array( |
|
| 160 | + 'payment_methods_settings_help_tab' => array( |
|
| 161 | + 'title' => __('Payment Method Settings', 'event_espresso'), |
|
| 162 | + 'filename' => 'payment_methods_settings', |
|
| 163 | + ), |
|
| 164 | + ), |
|
| 165 | + //'help_tour' => array( 'Payment_Methods_Settings_Help_Tour' ), |
|
| 166 | + 'metaboxes' => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')), |
|
| 167 | + 'require_nonce' => false, |
|
| 168 | + ), |
|
| 169 | + 'payment_log' => array( |
|
| 170 | + 'nav' => array( |
|
| 171 | + 'label' => __("Logs", 'event_espresso'), |
|
| 172 | + 'order' => 30, |
|
| 173 | + ), |
|
| 174 | + 'list_table' => 'Payment_Log_Admin_List_Table', |
|
| 175 | + 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 176 | + 'require_nonce' => false, |
|
| 177 | + ), |
|
| 178 | + ); |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + |
|
| 182 | + |
|
| 183 | + /** |
|
| 184 | + * @return array |
|
| 185 | + */ |
|
| 186 | + protected function _add_payment_method_help_tabs() |
|
| 187 | + { |
|
| 188 | + EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 189 | + $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types(); |
|
| 190 | + $all_pmt_help_tabs_config = array(); |
|
| 191 | + foreach ($payment_method_types as $payment_method_type) { |
|
| 192 | + if (! EE_Registry::instance()->CAP->current_user_can($payment_method_type->cap_name(), |
|
| 193 | + 'specific_payment_method_type_access') |
|
| 194 | + ) { |
|
| 195 | + continue; |
|
| 196 | + } |
|
| 197 | + foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) { |
|
| 198 | + $template_args = isset($config['template_args']) ? $config['template_args'] : array(); |
|
| 199 | + $template_args['admin_page_obj'] = $this; |
|
| 200 | + $all_pmt_help_tabs_config[$help_tab_name] = array( |
|
| 201 | + 'title' => $config['title'], |
|
| 202 | + 'content' => EEH_Template::display_template( |
|
| 203 | + $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php', |
|
| 204 | + $template_args, |
|
| 205 | + true), |
|
| 206 | + ); |
|
| 207 | + } |
|
| 208 | + } |
|
| 209 | + return $all_pmt_help_tabs_config; |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + |
|
| 213 | + |
|
| 214 | + //none of the below group are currently used for Gateway Settings |
|
| 215 | + protected function _add_screen_options() |
|
| 216 | + { |
|
| 217 | + } |
|
| 218 | + |
|
| 219 | + |
|
| 220 | + |
|
| 221 | + protected function _add_feature_pointers() |
|
| 222 | + { |
|
| 223 | + } |
|
| 224 | + |
|
| 225 | + |
|
| 226 | + |
|
| 227 | + public function admin_init() |
|
| 228 | + { |
|
| 229 | + } |
|
| 230 | + |
|
| 231 | + |
|
| 232 | + |
|
| 233 | + public function admin_notices() |
|
| 234 | + { |
|
| 235 | + } |
|
| 236 | + |
|
| 237 | + |
|
| 238 | + |
|
| 239 | + public function admin_footer_scripts() |
|
| 240 | + { |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + |
|
| 244 | + |
|
| 245 | + public function load_scripts_styles() |
|
| 246 | + { |
|
| 247 | + wp_enqueue_script('ee_admin_js'); |
|
| 248 | + wp_enqueue_script('ee-text-links'); |
|
| 249 | + wp_enqueue_script('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js', |
|
| 250 | + array('espresso-ui-theme', 'ee-datepicker'), EVENT_ESPRESSO_VERSION, true); |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + |
|
| 254 | + |
|
| 255 | + public function load_scripts_styles_default() |
|
| 256 | + { |
|
| 257 | + //styles |
|
| 258 | + wp_register_style('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'ee-payments.css', array(), |
|
| 259 | + EVENT_ESPRESSO_VERSION); |
|
| 260 | + wp_enqueue_style('espresso_payments'); |
|
| 261 | + wp_enqueue_style('ee-text-links'); |
|
| 262 | + //scripts |
|
| 263 | + } |
|
| 264 | + |
|
| 265 | + |
|
| 266 | + |
|
| 267 | + protected function _payment_methods_list() |
|
| 268 | + { |
|
| 269 | + /** |
|
| 270 | + * first let's ensure payment methods have been setup. We do this here because when people activate a |
|
| 271 | + * payment method for the first time (as an addon), it may not setup its capabilities or get registered correctly due |
|
| 272 | + * to the loading process. However, people MUST setup the details for the payment method so its safe to do a |
|
| 273 | + * recheck here. |
|
| 274 | + */ |
|
| 275 | + EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 276 | + EEM_Payment_Method::instance()->verify_button_urls(); |
|
| 277 | + //setup tabs, one for each payment method type |
|
| 278 | + $tabs = array(); |
|
| 279 | + $payment_methods = array(); |
|
| 280 | + foreach (EE_Payment_Method_Manager::instance()->payment_method_types() as $pmt_obj) { |
|
| 281 | + // we don't want to show admin-only PMTs for now |
|
| 282 | + if ($pmt_obj instanceof EE_PMT_Admin_Only) { |
|
| 283 | + continue; |
|
| 284 | + } |
|
| 285 | + //check access |
|
| 286 | + if (! EE_Registry::instance()->CAP->current_user_can($pmt_obj->cap_name(), |
|
| 287 | + 'specific_payment_method_type_access') |
|
| 288 | + ) { |
|
| 289 | + continue; |
|
| 290 | + } |
|
| 291 | + //check for any active pms of that type |
|
| 292 | + $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name()); |
|
| 293 | + if (! $payment_method instanceof EE_Payment_Method) { |
|
| 294 | + $payment_method = EE_Payment_Method::new_instance( |
|
| 295 | + array( |
|
| 296 | + 'PMD_slug' => sanitize_key($pmt_obj->system_name()), |
|
| 297 | + 'PMD_type' => $pmt_obj->system_name(), |
|
| 298 | + 'PMD_name' => $pmt_obj->pretty_name(), |
|
| 299 | + 'PMD_admin_name' => $pmt_obj->pretty_name(), |
|
| 300 | + ) |
|
| 301 | + ); |
|
| 302 | + } |
|
| 303 | + $payment_methods[$payment_method->slug()] = $payment_method; |
|
| 304 | + } |
|
| 305 | + $payment_methods = apply_filters('FHEE__Payments_Admin_Page___payment_methods_list__payment_methods', |
|
| 306 | + $payment_methods); |
|
| 307 | + foreach ($payment_methods as $payment_method) { |
|
| 308 | + if ($payment_method instanceof EE_Payment_Method) { |
|
| 309 | + add_meta_box( |
|
| 310 | + //html id |
|
| 311 | + 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 312 | + //title |
|
| 313 | + sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()), |
|
| 314 | + //callback |
|
| 315 | + array($this, 'payment_method_settings_meta_box'), |
|
| 316 | + //post type |
|
| 317 | + null, |
|
| 318 | + //context |
|
| 319 | + 'normal', |
|
| 320 | + //priority |
|
| 321 | + 'default', |
|
| 322 | + //callback args |
|
| 323 | + array('payment_method' => $payment_method) |
|
| 324 | + ); |
|
| 325 | + //setup for tabbed content |
|
| 326 | + $tabs[$payment_method->slug()] = array( |
|
| 327 | + 'label' => $payment_method->admin_name(), |
|
| 328 | + 'class' => $payment_method->active() ? 'gateway-active' : '', |
|
| 329 | + 'href' => 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 330 | + 'title' => __('Modify this Payment Method', 'event_espresso'), |
|
| 331 | + 'slug' => $payment_method->slug(), |
|
| 332 | + ); |
|
| 333 | + } |
|
| 334 | + } |
|
| 335 | + $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links($tabs, 'payment_method_links', |
|
| 336 | + '|', $this->_get_active_payment_method_slug()); |
|
| 337 | + $this->display_admin_page_with_sidebar(); |
|
| 338 | + } |
|
| 339 | + |
|
| 340 | + |
|
| 341 | + |
|
| 342 | + /** |
|
| 343 | + * _get_active_payment_method_slug |
|
| 344 | + * |
|
| 345 | + * @return string |
|
| 346 | + */ |
|
| 347 | + protected function _get_active_payment_method_slug() |
|
| 348 | + { |
|
| 349 | + $payment_method_slug = false; |
|
| 350 | + //decide which payment method tab to open first, as dictated by the request's 'payment_method' |
|
| 351 | + if (isset($this->_req_data['payment_method'])) { |
|
| 352 | + // if they provided the current payment method, use it |
|
| 353 | + $payment_method_slug = sanitize_key($this->_req_data['payment_method']); |
|
| 354 | + } |
|
| 355 | + $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug))); |
|
| 356 | + // if that didn't work or wasn't provided, find another way to select the current pm |
|
| 357 | + if (! $this->_verify_payment_method($payment_method)) { |
|
| 358 | + // like, looking for an active one |
|
| 359 | + $payment_method = EEM_Payment_Method::instance()->get_one_active('CART'); |
|
| 360 | + // test that one as well |
|
| 361 | + if ($this->_verify_payment_method($payment_method)) { |
|
| 362 | + $payment_method_slug = $payment_method->slug(); |
|
| 363 | + } else { |
|
| 364 | + $payment_method_slug = 'paypal_standard'; |
|
| 365 | + } |
|
| 366 | + } |
|
| 367 | + return $payment_method_slug; |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + |
|
| 371 | + |
|
| 372 | + /** |
|
| 373 | + * payment_method_settings_meta_box |
|
| 374 | + * returns TRUE if the passed payment method is properly constructed and the logged in user has the correct |
|
| 375 | + * capabilities to access it |
|
| 376 | + * |
|
| 377 | + * @param \EE_Payment_Method $payment_method |
|
| 378 | + * @return boolean |
|
| 379 | + */ |
|
| 380 | + protected function _verify_payment_method($payment_method) |
|
| 381 | + { |
|
| 382 | + if ( |
|
| 383 | + $payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base |
|
| 384 | + && EE_Registry::instance()->CAP->current_user_can($payment_method->type_obj()->cap_name(), |
|
| 385 | + 'specific_payment_method_type_access') |
|
| 386 | + ) { |
|
| 387 | + return true; |
|
| 388 | + } |
|
| 389 | + return false; |
|
| 390 | + } |
|
| 391 | + |
|
| 392 | + |
|
| 393 | + |
|
| 394 | + /** |
|
| 395 | + * payment_method_settings_meta_box |
|
| 396 | + * |
|
| 397 | + * @param NULL $post_obj_which_is_null is an object containing the current post (as a $post object) |
|
| 398 | + * @param array $metabox is an array with metabox id, title, callback, and args elements. the value |
|
| 399 | + * at 'args' has key 'payment_method', as set within _payment_methods_list |
|
| 400 | + * @return string |
|
| 401 | + * @throws EE_Error |
|
| 402 | + */ |
|
| 403 | + public function payment_method_settings_meta_box($post_obj_which_is_null, $metabox) |
|
| 404 | + { |
|
| 405 | + $payment_method = isset($metabox['args'], $metabox['args']['payment_method']) |
|
| 406 | + ? $metabox['args']['payment_method'] : null; |
|
| 407 | + if (! $payment_method instanceof EE_Payment_Method) { |
|
| 408 | + throw new EE_Error(sprintf(__('Payment method metabox setup incorrectly. No Payment method object was supplied', |
|
| 409 | + 'event_espresso'))); |
|
| 410 | + } |
|
| 411 | + $payment_method_scopes = $payment_method->active(); |
|
| 412 | + // if the payment method really exists show its form, otherwise the activation template |
|
| 413 | + if ($payment_method->ID() && ! empty($payment_method_scopes)) { |
|
| 414 | + $form = $this->_generate_payment_method_settings_form($payment_method); |
|
| 415 | + if ($form->form_data_present_in($this->_req_data)) { |
|
| 416 | + $form->receive_form_submission($this->_req_data); |
|
| 417 | + } |
|
| 418 | + echo $form->form_open() . $form->get_html_and_js() . $form->form_close(); |
|
| 419 | + } else { |
|
| 420 | + echo $this->_activate_payment_method_button($payment_method)->get_html_and_js(); |
|
| 421 | + } |
|
| 422 | + } |
|
| 423 | + |
|
| 424 | + |
|
| 425 | + |
|
| 426 | + /** |
|
| 427 | + * Gets the form for all the settings related to this payment method type |
|
| 428 | + * |
|
| 429 | + * @access protected |
|
| 430 | + * @param \EE_Payment_Method $payment_method |
|
| 431 | + * @return \EE_Form_Section_Proper |
|
| 432 | + */ |
|
| 433 | + protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method) |
|
| 434 | + { |
|
| 435 | + if (! $payment_method instanceof EE_Payment_Method) { |
|
| 436 | + return new EE_Form_Section_Proper(); |
|
| 437 | + } |
|
| 438 | + return new EE_Form_Section_Proper( |
|
| 439 | + array( |
|
| 440 | + 'name' => $payment_method->slug() . '_settings_form', |
|
| 441 | + 'html_id' => $payment_method->slug() . '_settings_form', |
|
| 442 | + 'action' => EE_Admin_Page::add_query_args_and_nonce( |
|
| 443 | + array( |
|
| 444 | + 'action' => 'update_payment_method', |
|
| 445 | + 'payment_method' => $payment_method->slug(), |
|
| 446 | + ), |
|
| 447 | + EE_PAYMENTS_ADMIN_URL |
|
| 448 | + ), |
|
| 449 | + 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 450 | + 'subsections' => apply_filters( |
|
| 451 | + 'FHEE__Payments_Admin_Page___generate_payment_method_settings_form__form_subsections', |
|
| 452 | + array( |
|
| 453 | + 'pci_dss_compliance' => $this->_pci_dss_compliance($payment_method), |
|
| 454 | + 'currency_support' => $this->_currency_support($payment_method), |
|
| 455 | + 'payment_method_settings' => $this->_payment_method_settings($payment_method), |
|
| 456 | + 'update' => $this->_update_payment_method_button($payment_method), |
|
| 457 | + 'deactivate' => $this->_deactivate_payment_method_button($payment_method), |
|
| 458 | + 'fine_print' => $this->_fine_print(), |
|
| 459 | + ), |
|
| 460 | + $payment_method |
|
| 461 | + ), |
|
| 462 | + ) |
|
| 463 | + ); |
|
| 464 | + } |
|
| 465 | + |
|
| 466 | + |
|
| 467 | + |
|
| 468 | + /** |
|
| 469 | + * _pci_dss_compliance |
|
| 470 | + * |
|
| 471 | + * @access protected |
|
| 472 | + * @param \EE_Payment_Method $payment_method |
|
| 473 | + * @return \EE_Form_Section_Proper |
|
| 474 | + */ |
|
| 475 | + protected function _pci_dss_compliance(EE_Payment_Method $payment_method) |
|
| 476 | + { |
|
| 477 | + if ($payment_method->type_obj()->requires_https()) { |
|
| 478 | + return new EE_Form_Section_HTML( |
|
| 479 | + EEH_HTML::tr( |
|
| 480 | + EEH_HTML::th( |
|
| 481 | + EEH_HTML::label( |
|
| 482 | + EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
|
| 483 | + ) |
|
| 484 | + ) . |
|
| 485 | + EEH_HTML::td( |
|
| 486 | + EEH_HTML::strong(__('You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.', |
|
| 487 | + 'event_espresso')) |
|
| 488 | + . |
|
| 489 | + EEH_HTML::br() |
|
| 490 | + . |
|
| 491 | + __('Learn more about ', 'event_espresso') |
|
| 492 | + . EEH_HTML::link('https://www.pcisecuritystandards.org/merchants/index.php', |
|
| 493 | + __('PCI DSS compliance', 'event_espresso')) |
|
| 494 | + ) |
|
| 495 | + ) |
|
| 496 | + ); |
|
| 497 | + } else { |
|
| 498 | + return new EE_Form_Section_HTML(''); |
|
| 499 | + } |
|
| 500 | + } |
|
| 501 | + |
|
| 502 | + |
|
| 503 | + |
|
| 504 | + /** |
|
| 505 | + * _currency_support |
|
| 506 | + * |
|
| 507 | + * @access protected |
|
| 508 | + * @param \EE_Payment_Method $payment_method |
|
| 509 | + * @return \EE_Form_Section_Proper |
|
| 510 | + */ |
|
| 511 | + protected function _currency_support(EE_Payment_Method $payment_method) |
|
| 512 | + { |
|
| 513 | + if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) { |
|
| 514 | + return new EE_Form_Section_HTML( |
|
| 515 | + EEH_HTML::tr( |
|
| 516 | + EEH_HTML::th( |
|
| 517 | + EEH_HTML::label( |
|
| 518 | + EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
|
| 519 | + ) |
|
| 520 | + ) . |
|
| 521 | + EEH_HTML::td( |
|
| 522 | + EEH_HTML::strong( |
|
| 523 | + sprintf( |
|
| 524 | + __('This payment method does not support the currency set on your site (%1$s). Please activate a different payment method or change your site\'s country and associated currency.', |
|
| 525 | + 'event_espresso'), |
|
| 526 | + EE_Config::instance()->currency->code |
|
| 527 | + ) |
|
| 528 | + ) |
|
| 529 | + ) |
|
| 530 | + ) |
|
| 531 | + ); |
|
| 532 | + } else { |
|
| 533 | + return new EE_Form_Section_HTML(''); |
|
| 534 | + } |
|
| 535 | + } |
|
| 536 | + |
|
| 537 | + |
|
| 538 | + |
|
| 539 | + /** |
|
| 540 | + * _update_payment_method_button |
|
| 541 | + * |
|
| 542 | + * @access protected |
|
| 543 | + * @param \EE_Payment_Method $payment_method |
|
| 544 | + * @return \EE_Form_Section_HTML |
|
| 545 | + */ |
|
| 546 | + protected function _payment_method_settings(EE_Payment_Method $payment_method) |
|
| 547 | + { |
|
| 548 | + //modify the form so we only have/show fields that will be implemented for this version |
|
| 549 | + return $this->_simplify_form($payment_method->type_obj()->settings_form(), $payment_method->name()); |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + |
|
| 553 | + |
|
| 554 | + /** |
|
| 555 | + * Simplifies the form to merely reproduce 4.1's gateway settings functionality |
|
| 556 | + * |
|
| 557 | + * @param EE_Form_Section_Proper $form_section |
|
| 558 | + * @param string $payment_method_name |
|
| 559 | + * @return \EE_Payment_Method_Form |
|
| 560 | + * @throws \EE_Error |
|
| 561 | + */ |
|
| 562 | + protected function _simplify_form($form_section, $payment_method_name = '') |
|
| 563 | + { |
|
| 564 | + if ($form_section instanceof EE_Payment_Method_Form) { |
|
| 565 | + $form_section->exclude( |
|
| 566 | + array( |
|
| 567 | + 'PMD_type', //dont want them changing the type |
|
| 568 | + 'PMD_slug', //or the slug (probably never) |
|
| 569 | + 'PMD_wp_user', //or the user's ID |
|
| 570 | + 'Currency' //or the currency, until the rest of EE supports simultaneous currencies |
|
| 571 | + ) |
|
| 572 | + ); |
|
| 573 | + return $form_section; |
|
| 574 | + } else { |
|
| 575 | + throw new EE_Error(sprintf(__('The EE_Payment_Method_Form for the "%1$s" payment method is missing or invalid.', |
|
| 576 | + 'event_espresso'), $payment_method_name)); |
|
| 577 | + } |
|
| 578 | + } |
|
| 579 | + |
|
| 580 | + |
|
| 581 | + |
|
| 582 | + /** |
|
| 583 | + * _update_payment_method_button |
|
| 584 | + * |
|
| 585 | + * @access protected |
|
| 586 | + * @param \EE_Payment_Method $payment_method |
|
| 587 | + * @return \EE_Form_Section_HTML |
|
| 588 | + */ |
|
| 589 | + protected function _update_payment_method_button(EE_Payment_Method $payment_method) |
|
| 590 | + { |
|
| 591 | + $update_button = new EE_Submit_Input( |
|
| 592 | + array( |
|
| 593 | + 'name' => 'submit', |
|
| 594 | + 'html_id' => 'save_' . $payment_method->slug() . '_settings', |
|
| 595 | + 'default' => sprintf(__('Update %s Payment Settings', 'event_espresso'), |
|
| 596 | + $payment_method->admin_name()), |
|
| 597 | + 'html_label' => EEH_HTML::nbsp(), |
|
| 598 | + ) |
|
| 599 | + ); |
|
| 600 | + return new EE_Form_Section_HTML( |
|
| 601 | + EEH_HTML::no_row(EEH_HTML::br(2)) . |
|
| 602 | + EEH_HTML::tr( |
|
| 603 | + EEH_HTML::th(__('Update Settings', 'event_espresso')) . |
|
| 604 | + EEH_HTML::td( |
|
| 605 | + $update_button->get_html_for_input() |
|
| 606 | + ) |
|
| 607 | + ) |
|
| 608 | + ); |
|
| 609 | + } |
|
| 610 | + |
|
| 611 | + |
|
| 612 | + |
|
| 613 | + /** |
|
| 614 | + * _deactivate_payment_method_button |
|
| 615 | + * |
|
| 616 | + * @access protected |
|
| 617 | + * @param \EE_Payment_Method $payment_method |
|
| 618 | + * @return \EE_Form_Section_Proper |
|
| 619 | + */ |
|
| 620 | + protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method) |
|
| 621 | + { |
|
| 622 | + $link_text_and_title = sprintf(__('Deactivate %1$s Payments?', 'event_espresso'), |
|
| 623 | + $payment_method->admin_name()); |
|
| 624 | + return new EE_Form_Section_HTML( |
|
| 625 | + EEH_HTML::tr( |
|
| 626 | + EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) . |
|
| 627 | + EEH_HTML::td( |
|
| 628 | + EEH_HTML::link( |
|
| 629 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 630 | + array( |
|
| 631 | + 'action' => 'deactivate_payment_method', |
|
| 632 | + 'payment_method' => $payment_method->slug(), |
|
| 633 | + ), |
|
| 634 | + EE_PAYMENTS_ADMIN_URL |
|
| 635 | + ), |
|
| 636 | + $link_text_and_title, |
|
| 637 | + $link_text_and_title, |
|
| 638 | + 'deactivate_' . $payment_method->slug(), |
|
| 639 | + 'espresso-button button-secondary' |
|
| 640 | + ) |
|
| 641 | + ) |
|
| 642 | + ) |
|
| 643 | + ); |
|
| 644 | + } |
|
| 645 | + |
|
| 646 | + |
|
| 647 | + |
|
| 648 | + /** |
|
| 649 | + * _activate_payment_method_button |
|
| 650 | + * |
|
| 651 | + * @access protected |
|
| 652 | + * @param \EE_Payment_Method $payment_method |
|
| 653 | + * @return \EE_Form_Section_Proper |
|
| 654 | + */ |
|
| 655 | + protected function _activate_payment_method_button(EE_Payment_Method $payment_method) |
|
| 656 | + { |
|
| 657 | + $link_text_and_title = sprintf(__('Activate %1$s Payment Method?', 'event_espresso'), |
|
| 658 | + $payment_method->admin_name()); |
|
| 659 | + return new EE_Form_Section_Proper( |
|
| 660 | + array( |
|
| 661 | + 'name' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 662 | + 'html_id' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 663 | + 'action' => '#', |
|
| 664 | + 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 665 | + 'subsections' => apply_filters( |
|
| 666 | + 'FHEE__Payments_Admin_Page___activate_payment_method_button__form_subsections', |
|
| 667 | + array( |
|
| 668 | + new EE_Form_Section_HTML( |
|
| 669 | + EEH_HTML::tr( |
|
| 670 | + EEH_HTML::td($payment_method->type_obj()->introductory_html(), |
|
| 671 | + '', |
|
| 672 | + '', |
|
| 673 | + '', |
|
| 674 | + 'colspan="2"' |
|
| 675 | + ) |
|
| 676 | + ) . |
|
| 677 | + EEH_HTML::tr( |
|
| 678 | + EEH_HTML::th( |
|
| 679 | + EEH_HTML::label(__('Click to Activate ', 'event_espresso')) |
|
| 680 | + ) . |
|
| 681 | + EEH_HTML::td( |
|
| 682 | + EEH_HTML::link( |
|
| 683 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 684 | + array( |
|
| 685 | + 'action' => 'activate_payment_method', |
|
| 686 | + 'payment_method_type' => $payment_method->type(), |
|
| 687 | + ), |
|
| 688 | + EE_PAYMENTS_ADMIN_URL |
|
| 689 | + ), |
|
| 690 | + $link_text_and_title, |
|
| 691 | + $link_text_and_title, |
|
| 692 | + 'activate_' . $payment_method->slug(), |
|
| 693 | + 'espresso-button-green button-primary' |
|
| 694 | + ) |
|
| 695 | + ) |
|
| 696 | + ) |
|
| 697 | + ), |
|
| 698 | + ), |
|
| 699 | + $payment_method |
|
| 700 | + ), |
|
| 701 | + ) |
|
| 702 | + ); |
|
| 703 | + } |
|
| 704 | + |
|
| 705 | + |
|
| 706 | + |
|
| 707 | + /** |
|
| 708 | + * _fine_print |
|
| 709 | + * |
|
| 710 | + * @access protected |
|
| 711 | + * @return \EE_Form_Section_HTML |
|
| 712 | + */ |
|
| 713 | + protected function _fine_print() |
|
| 714 | + { |
|
| 715 | + return new EE_Form_Section_HTML( |
|
| 716 | + EEH_HTML::tr( |
|
| 717 | + EEH_HTML::th() . |
|
| 718 | + EEH_HTML::td( |
|
| 719 | + EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text') |
|
| 720 | + ) |
|
| 721 | + ) |
|
| 722 | + ); |
|
| 723 | + } |
|
| 724 | + |
|
| 725 | + |
|
| 726 | + |
|
| 727 | + /** |
|
| 728 | + * Activates a payment method of that type. Mostly assuming there is only 1 of that type (or none so far) |
|
| 729 | + * |
|
| 730 | + * @global WP_User $current_user |
|
| 731 | + */ |
|
| 732 | + protected function _activate_payment_method() |
|
| 733 | + { |
|
| 734 | + if (isset($this->_req_data['payment_method_type'])) { |
|
| 735 | + $payment_method_type = sanitize_text_field($this->_req_data['payment_method_type']); |
|
| 736 | + //see if one exists |
|
| 737 | + EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 738 | + $payment_method = EE_Payment_Method_Manager::instance() |
|
| 739 | + ->activate_a_payment_method_of_type($payment_method_type); |
|
| 740 | + $this->_redirect_after_action(1, 'Payment Method', 'activated', |
|
| 741 | + array('action' => 'default', 'payment_method' => $payment_method->slug())); |
|
| 742 | + } else { |
|
| 743 | + $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default')); |
|
| 744 | + } |
|
| 745 | + } |
|
| 746 | + |
|
| 747 | + |
|
| 748 | + |
|
| 749 | + /** |
|
| 750 | + * Deactivates the payment method with the specified slug, and redirects. |
|
| 751 | + */ |
|
| 752 | + protected function _deactivate_payment_method() |
|
| 753 | + { |
|
| 754 | + if (isset($this->_req_data['payment_method'])) { |
|
| 755 | + $payment_method_slug = sanitize_key($this->_req_data['payment_method']); |
|
| 756 | + //deactivate it |
|
| 757 | + EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 758 | + $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method($payment_method_slug); |
|
| 759 | + $this->_redirect_after_action($count_updated, 'Payment Method', 'deactivated', |
|
| 760 | + array('action' => 'default', 'payment_method' => $payment_method_slug)); |
|
| 761 | + } else { |
|
| 762 | + $this->_redirect_after_action(false, 'Payment Method', 'deactivated', array('action' => 'default')); |
|
| 763 | + } |
|
| 764 | + } |
|
| 765 | + |
|
| 766 | + |
|
| 767 | + |
|
| 768 | + /** |
|
| 769 | + * Processes the payment method form that was submitted. This is slightly trickier than usual form |
|
| 770 | + * processing because we first need to identify WHICH form was processed and which payment method |
|
| 771 | + * it corresponds to. Once we have done that, we see if the form is valid. If it is, the |
|
| 772 | + * form's data is saved and we redirect to the default payment methods page, setting the updated payment method |
|
| 773 | + * as the currently-selected one. If it DOESN'T validate, we render the page with the form's errors (in the |
|
| 774 | + * subsequently called 'headers_sent_func' which is _payment_methods_list) |
|
| 775 | + * |
|
| 776 | + * @return void |
|
| 777 | + */ |
|
| 778 | + protected function _update_payment_method() |
|
| 779 | + { |
|
| 780 | + if ($_SERVER['REQUEST_METHOD'] == 'POST') { |
|
| 781 | + //ok let's find which gateway form to use based on the form input |
|
| 782 | + EE_Registry::instance()->load_lib('Payment_Method_Manager'); |
|
| 783 | + /** @var $correct_pmt_form_to_use EE_Payment_Method_Form */ |
|
| 784 | + $correct_pmt_form_to_use = null; |
|
| 785 | + $payment_method = null; |
|
| 786 | + foreach (EEM_Payment_Method::instance()->get_all() as $payment_method) { |
|
| 787 | + //get the form and simplify it, like what we do when we display it |
|
| 788 | + $pmt_form = $this->_generate_payment_method_settings_form($payment_method); |
|
| 789 | + if ($pmt_form->form_data_present_in($this->_req_data)) { |
|
| 790 | + $correct_pmt_form_to_use = $pmt_form; |
|
| 791 | + break; |
|
| 792 | + } |
|
| 793 | + } |
|
| 794 | + //if we couldn't find the correct payment method type... |
|
| 795 | + if (! $correct_pmt_form_to_use) { |
|
| 796 | + EE_Error::add_error(__("We could not find which payment method type your form submission related to. Please contact support", |
|
| 797 | + 'event_espresso'), __FILE__, __FUNCTION__, __LINE__); |
|
| 798 | + $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default')); |
|
| 799 | + } |
|
| 800 | + $correct_pmt_form_to_use->receive_form_submission($this->_req_data); |
|
| 801 | + if ($correct_pmt_form_to_use->is_valid()) { |
|
| 802 | + $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings'); |
|
| 803 | + if (! $payment_settings_subform instanceof EE_Payment_Method_Form) { |
|
| 804 | + throw new EE_Error( |
|
| 805 | + sprintf( |
|
| 806 | + __('The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.', |
|
| 807 | + 'event_espresso'), |
|
| 808 | + 'payment_method_settings' |
|
| 809 | + ) |
|
| 810 | + ); |
|
| 811 | + } |
|
| 812 | + $payment_settings_subform->save(); |
|
| 813 | + /** @var $pm EE_Payment_Method */ |
|
| 814 | + $this->_redirect_after_action(true, 'Payment Method', 'updated', |
|
| 815 | + array('action' => 'default', 'payment_method' => $payment_method->slug())); |
|
| 816 | + } else { |
|
| 817 | + EE_Error::add_error( |
|
| 818 | + sprintf( |
|
| 819 | + __('Payment method of type %s was not saved because there were validation errors. They have been marked in the form', |
|
| 820 | + 'event_espresso'), |
|
| 821 | + $payment_method instanceof EE_PMT_Base ? $payment_method->pretty_name() |
|
| 822 | + : __('"(unknown)"', 'event_espresso') |
|
| 823 | + ), |
|
| 824 | + __FILE__, |
|
| 825 | + __FUNCTION__, |
|
| 826 | + __LINE__ |
|
| 827 | + ); |
|
| 828 | + } |
|
| 829 | + } |
|
| 830 | + return; |
|
| 831 | + } |
|
| 832 | + |
|
| 833 | + |
|
| 834 | + |
|
| 835 | + protected function _payment_settings() |
|
| 836 | + { |
|
| 837 | + $this->_template_args['values'] = $this->_yes_no_values; |
|
| 838 | + $this->_template_args['show_pending_payment_options'] = isset(EE_Registry::instance()->CFG->registration->show_pending_payment_options) |
|
| 839 | + ? absint(EE_Registry::instance()->CFG->registration->show_pending_payment_options) : false; |
|
| 840 | + $this->_set_add_edit_form_tags('update_payment_settings'); |
|
| 841 | + $this->_set_publish_post_box_vars(null, false, false, null, false); |
|
| 842 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template(EE_PAYMENTS_TEMPLATE_PATH |
|
| 843 | + . 'payment_settings.template.php', |
|
| 844 | + $this->_template_args, true); |
|
| 845 | + $this->display_admin_page_with_sidebar(); |
|
| 846 | + } |
|
| 847 | + |
|
| 848 | + |
|
| 849 | + |
|
| 850 | + /** |
|
| 851 | + * _update_payment_settings |
|
| 852 | + * |
|
| 853 | + * @access protected |
|
| 854 | + * @return array |
|
| 855 | + */ |
|
| 856 | + protected function _update_payment_settings() |
|
| 857 | + { |
|
| 858 | + EE_Registry::instance()->CFG->registration->show_pending_payment_options = isset($this->_req_data['show_pending_payment_options']) |
|
| 859 | + ? $this->_req_data['show_pending_payment_options'] : false; |
|
| 860 | + EE_Registry::instance()->CFG = apply_filters('FHEE__Payments_Admin_Page___update_payment_settings__CFG', |
|
| 861 | + EE_Registry::instance()->CFG); |
|
| 862 | 862 | // $superform = new EE_Form_Section_Proper( |
| 863 | 863 | // array( |
| 864 | 864 | // 'subsections' => array( |
@@ -876,176 +876,176 @@ discard block |
||
| 876 | 876 | // ); |
| 877 | 877 | // $this->_redirect_after_action( 0, 'settings', 'updated', array( 'action' => 'payment_settings' ) ); |
| 878 | 878 | // } |
| 879 | - $what = __('Payment Settings', 'event_espresso'); |
|
| 880 | - $success = $this->_update_espresso_configuration($what, EE_Registry::instance()->CFG, __FILE__, __FUNCTION__, |
|
| 881 | - __LINE__); |
|
| 882 | - $this->_redirect_after_action($success, $what, __('updated', 'event_espresso'), |
|
| 883 | - array('action' => 'payment_settings')); |
|
| 884 | - } |
|
| 879 | + $what = __('Payment Settings', 'event_espresso'); |
|
| 880 | + $success = $this->_update_espresso_configuration($what, EE_Registry::instance()->CFG, __FILE__, __FUNCTION__, |
|
| 881 | + __LINE__); |
|
| 882 | + $this->_redirect_after_action($success, $what, __('updated', 'event_espresso'), |
|
| 883 | + array('action' => 'payment_settings')); |
|
| 884 | + } |
|
| 885 | 885 | |
| 886 | 886 | |
| 887 | 887 | |
| 888 | - protected function _payment_log_overview_list_table() |
|
| 889 | - { |
|
| 888 | + protected function _payment_log_overview_list_table() |
|
| 889 | + { |
|
| 890 | 890 | // $this->_search_btn_label = __('Payment Log', 'event_espresso'); |
| 891 | - $this->display_admin_list_table_page_with_sidebar(); |
|
| 892 | - } |
|
| 893 | - |
|
| 894 | - |
|
| 895 | - |
|
| 896 | - protected function _set_list_table_views_payment_log() |
|
| 897 | - { |
|
| 898 | - $this->_views = array( |
|
| 899 | - 'all' => array( |
|
| 900 | - 'slug' => 'all', |
|
| 901 | - 'label' => __('View All Logs', 'event_espresso'), |
|
| 902 | - 'count' => 0, |
|
| 903 | - ), |
|
| 904 | - ); |
|
| 905 | - } |
|
| 906 | - |
|
| 907 | - |
|
| 908 | - |
|
| 909 | - /** |
|
| 910 | - * @param int $per_page |
|
| 911 | - * @param int $current_page |
|
| 912 | - * @param bool $count |
|
| 913 | - * @return array |
|
| 914 | - */ |
|
| 915 | - public function get_payment_logs($per_page = 50, $current_page = 0, $count = false) |
|
| 916 | - { |
|
| 917 | - EE_Registry::instance()->load_model('Change_Log'); |
|
| 918 | - //we may need to do multiple queries (joining differently), so we actually wan tan array of query params |
|
| 919 | - $query_params = array(array('LOG_type' => EEM_Change_Log::type_gateway)); |
|
| 920 | - //check if they've selected a specific payment method |
|
| 921 | - if (isset($this->_req_data['_payment_method']) && $this->_req_data['_payment_method'] !== 'all') { |
|
| 922 | - $query_params[0]['OR*pm_or_pay_pm'] = array( |
|
| 923 | - 'Payment.Payment_Method.PMD_ID' => $this->_req_data['_payment_method'], |
|
| 924 | - 'Payment_Method.PMD_ID' => $this->_req_data['_payment_method'], |
|
| 925 | - ); |
|
| 926 | - } |
|
| 927 | - //take into account search |
|
| 928 | - if (isset($this->_req_data['s']) && $this->_req_data['s']) { |
|
| 929 | - $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%'); |
|
| 930 | - $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string; |
|
| 931 | - $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string; |
|
| 932 | - $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string; |
|
| 933 | - $query_params[0]['OR*s']['Payment.Payment_Method.PMD_name'] = $similarity_string; |
|
| 934 | - $query_params[0]['OR*s']['Payment.Payment_Method.PMD_admin_name'] = $similarity_string; |
|
| 935 | - $query_params[0]['OR*s']['Payment.Payment_Method.PMD_type'] = $similarity_string; |
|
| 936 | - $query_params[0]['OR*s']['LOG_message'] = $similarity_string; |
|
| 937 | - $query_params[0]['OR*s']['Payment_Method.PMD_name'] = $similarity_string; |
|
| 938 | - $query_params[0]['OR*s']['Payment_Method.PMD_admin_name'] = $similarity_string; |
|
| 939 | - $query_params[0]['OR*s']['Payment_Method.PMD_type'] = $similarity_string; |
|
| 940 | - $query_params[0]['OR*s']['LOG_message'] = $similarity_string; |
|
| 941 | - } |
|
| 942 | - if (isset($this->_req_data['payment-filter-start-date']) |
|
| 943 | - && isset($this->_req_data['payment-filter-end-date']) |
|
| 944 | - ) { |
|
| 945 | - //add date |
|
| 946 | - $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']); |
|
| 947 | - $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']); |
|
| 948 | - //make sure our timestamps start and end right at the boundaries for each day |
|
| 949 | - $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00'; |
|
| 950 | - $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59'; |
|
| 951 | - //convert to timestamps |
|
| 952 | - $start_date = strtotime($start_date); |
|
| 953 | - $end_date = strtotime($end_date); |
|
| 954 | - //makes sure start date is the lowest value and vice versa |
|
| 955 | - $start_date = min($start_date, $end_date); |
|
| 956 | - $end_date = max($start_date, $end_date); |
|
| 957 | - //convert for query |
|
| 958 | - $start_date = EEM_Change_Log::instance() |
|
| 959 | - ->convert_datetime_for_query('LOG_time', date('Y-m-d H:i:s', $start_date), |
|
| 960 | - 'Y-m-d H:i:s'); |
|
| 961 | - $end_date = EEM_Change_Log::instance() |
|
| 962 | - ->convert_datetime_for_query('LOG_time', date('Y-m-d H:i:s', $end_date), |
|
| 963 | - 'Y-m-d H:i:s'); |
|
| 964 | - $query_params[0]['LOG_time'] = array('BETWEEN', array($start_date, $end_date)); |
|
| 965 | - } |
|
| 966 | - if ($count) { |
|
| 967 | - return EEM_Change_Log::instance()->count($query_params); |
|
| 968 | - } |
|
| 969 | - if (isset($this->_req_data['order'])) { |
|
| 970 | - $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order'] |
|
| 971 | - : 'DESC'; |
|
| 972 | - $query_params['order_by'] = array('LOG_time' => $sort); |
|
| 973 | - } else { |
|
| 974 | - $query_params['order_by'] = array('LOG_time' => 'DESC'); |
|
| 975 | - } |
|
| 976 | - $offset = ($current_page - 1) * $per_page; |
|
| 977 | - if (! isset($this->_req_data['download_results'])) { |
|
| 978 | - $query_params['limit'] = array($offset, $per_page); |
|
| 979 | - } |
|
| 980 | - //now they've requested to instead just download the file instead of viewing it. |
|
| 981 | - if (isset($this->_req_data['download_results'])) { |
|
| 982 | - $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params); |
|
| 983 | - header('Content-Disposition: attachment'); |
|
| 984 | - header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url())); |
|
| 985 | - echo "<h1>Payment Logs for " . site_url() . "</h1>"; |
|
| 986 | - echo "<h3>Query:</h3>"; |
|
| 987 | - var_dump($query_params); |
|
| 988 | - echo "<h3>Results:</h3>"; |
|
| 989 | - var_dump($wpdb_results); |
|
| 990 | - die; |
|
| 991 | - } |
|
| 992 | - $results = EEM_Change_Log::instance()->get_all($query_params); |
|
| 993 | - return $results; |
|
| 994 | - } |
|
| 995 | - |
|
| 996 | - |
|
| 997 | - |
|
| 998 | - /** |
|
| 999 | - * Used by usort to RE-sort log query results, because we lose the ordering |
|
| 1000 | - * because we're possibly combining the results from two queries |
|
| 1001 | - * |
|
| 1002 | - * @param EE_Change_Log $logA |
|
| 1003 | - * @param EE_Change_Log $logB |
|
| 1004 | - * @return int |
|
| 1005 | - */ |
|
| 1006 | - protected function _sort_logs_again($logA, $logB) |
|
| 1007 | - { |
|
| 1008 | - $timeA = $logA->get_raw('LOG_time'); |
|
| 1009 | - $timeB = $logB->get_raw('LOG_time'); |
|
| 1010 | - if ($timeA == $timeB) { |
|
| 1011 | - return 0; |
|
| 1012 | - } |
|
| 1013 | - $comparison = $timeA < $timeB ? -1 : 1; |
|
| 1014 | - if (strtoupper($this->_sort_logs_again_direction) == 'DESC') { |
|
| 1015 | - return $comparison * -1; |
|
| 1016 | - } else { |
|
| 1017 | - return $comparison; |
|
| 1018 | - } |
|
| 1019 | - } |
|
| 1020 | - |
|
| 1021 | - |
|
| 1022 | - |
|
| 1023 | - protected function _payment_log_details() |
|
| 1024 | - { |
|
| 1025 | - EE_Registry::instance()->load_model('Change_Log'); |
|
| 1026 | - /** @var $payment_log EE_Change_Log */ |
|
| 1027 | - $payment_log = EEM_Change_Log::instance()->get_one_by_ID($this->_req_data['ID']); |
|
| 1028 | - $payment_method = null; |
|
| 1029 | - $transaction = null; |
|
| 1030 | - if ($payment_log instanceof EE_Change_Log) { |
|
| 1031 | - if ($payment_log->object() instanceof EE_Payment) { |
|
| 1032 | - $payment_method = $payment_log->object()->payment_method(); |
|
| 1033 | - $transaction = $payment_log->object()->transaction(); |
|
| 1034 | - } elseif ($payment_log->object() instanceof EE_Payment_Method) { |
|
| 1035 | - $payment_method = $payment_log->object(); |
|
| 1036 | - } |
|
| 1037 | - } |
|
| 1038 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
| 1039 | - EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php', |
|
| 1040 | - array( |
|
| 1041 | - 'payment_log' => $payment_log, |
|
| 1042 | - 'payment_method' => $payment_method, |
|
| 1043 | - 'transaction' => $transaction, |
|
| 1044 | - ), |
|
| 1045 | - true |
|
| 1046 | - ); |
|
| 1047 | - $this->display_admin_page_with_sidebar(); |
|
| 1048 | - } |
|
| 891 | + $this->display_admin_list_table_page_with_sidebar(); |
|
| 892 | + } |
|
| 893 | + |
|
| 894 | + |
|
| 895 | + |
|
| 896 | + protected function _set_list_table_views_payment_log() |
|
| 897 | + { |
|
| 898 | + $this->_views = array( |
|
| 899 | + 'all' => array( |
|
| 900 | + 'slug' => 'all', |
|
| 901 | + 'label' => __('View All Logs', 'event_espresso'), |
|
| 902 | + 'count' => 0, |
|
| 903 | + ), |
|
| 904 | + ); |
|
| 905 | + } |
|
| 906 | + |
|
| 907 | + |
|
| 908 | + |
|
| 909 | + /** |
|
| 910 | + * @param int $per_page |
|
| 911 | + * @param int $current_page |
|
| 912 | + * @param bool $count |
|
| 913 | + * @return array |
|
| 914 | + */ |
|
| 915 | + public function get_payment_logs($per_page = 50, $current_page = 0, $count = false) |
|
| 916 | + { |
|
| 917 | + EE_Registry::instance()->load_model('Change_Log'); |
|
| 918 | + //we may need to do multiple queries (joining differently), so we actually wan tan array of query params |
|
| 919 | + $query_params = array(array('LOG_type' => EEM_Change_Log::type_gateway)); |
|
| 920 | + //check if they've selected a specific payment method |
|
| 921 | + if (isset($this->_req_data['_payment_method']) && $this->_req_data['_payment_method'] !== 'all') { |
|
| 922 | + $query_params[0]['OR*pm_or_pay_pm'] = array( |
|
| 923 | + 'Payment.Payment_Method.PMD_ID' => $this->_req_data['_payment_method'], |
|
| 924 | + 'Payment_Method.PMD_ID' => $this->_req_data['_payment_method'], |
|
| 925 | + ); |
|
| 926 | + } |
|
| 927 | + //take into account search |
|
| 928 | + if (isset($this->_req_data['s']) && $this->_req_data['s']) { |
|
| 929 | + $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%'); |
|
| 930 | + $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string; |
|
| 931 | + $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string; |
|
| 932 | + $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string; |
|
| 933 | + $query_params[0]['OR*s']['Payment.Payment_Method.PMD_name'] = $similarity_string; |
|
| 934 | + $query_params[0]['OR*s']['Payment.Payment_Method.PMD_admin_name'] = $similarity_string; |
|
| 935 | + $query_params[0]['OR*s']['Payment.Payment_Method.PMD_type'] = $similarity_string; |
|
| 936 | + $query_params[0]['OR*s']['LOG_message'] = $similarity_string; |
|
| 937 | + $query_params[0]['OR*s']['Payment_Method.PMD_name'] = $similarity_string; |
|
| 938 | + $query_params[0]['OR*s']['Payment_Method.PMD_admin_name'] = $similarity_string; |
|
| 939 | + $query_params[0]['OR*s']['Payment_Method.PMD_type'] = $similarity_string; |
|
| 940 | + $query_params[0]['OR*s']['LOG_message'] = $similarity_string; |
|
| 941 | + } |
|
| 942 | + if (isset($this->_req_data['payment-filter-start-date']) |
|
| 943 | + && isset($this->_req_data['payment-filter-end-date']) |
|
| 944 | + ) { |
|
| 945 | + //add date |
|
| 946 | + $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']); |
|
| 947 | + $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']); |
|
| 948 | + //make sure our timestamps start and end right at the boundaries for each day |
|
| 949 | + $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00'; |
|
| 950 | + $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59'; |
|
| 951 | + //convert to timestamps |
|
| 952 | + $start_date = strtotime($start_date); |
|
| 953 | + $end_date = strtotime($end_date); |
|
| 954 | + //makes sure start date is the lowest value and vice versa |
|
| 955 | + $start_date = min($start_date, $end_date); |
|
| 956 | + $end_date = max($start_date, $end_date); |
|
| 957 | + //convert for query |
|
| 958 | + $start_date = EEM_Change_Log::instance() |
|
| 959 | + ->convert_datetime_for_query('LOG_time', date('Y-m-d H:i:s', $start_date), |
|
| 960 | + 'Y-m-d H:i:s'); |
|
| 961 | + $end_date = EEM_Change_Log::instance() |
|
| 962 | + ->convert_datetime_for_query('LOG_time', date('Y-m-d H:i:s', $end_date), |
|
| 963 | + 'Y-m-d H:i:s'); |
|
| 964 | + $query_params[0]['LOG_time'] = array('BETWEEN', array($start_date, $end_date)); |
|
| 965 | + } |
|
| 966 | + if ($count) { |
|
| 967 | + return EEM_Change_Log::instance()->count($query_params); |
|
| 968 | + } |
|
| 969 | + if (isset($this->_req_data['order'])) { |
|
| 970 | + $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order'] |
|
| 971 | + : 'DESC'; |
|
| 972 | + $query_params['order_by'] = array('LOG_time' => $sort); |
|
| 973 | + } else { |
|
| 974 | + $query_params['order_by'] = array('LOG_time' => 'DESC'); |
|
| 975 | + } |
|
| 976 | + $offset = ($current_page - 1) * $per_page; |
|
| 977 | + if (! isset($this->_req_data['download_results'])) { |
|
| 978 | + $query_params['limit'] = array($offset, $per_page); |
|
| 979 | + } |
|
| 980 | + //now they've requested to instead just download the file instead of viewing it. |
|
| 981 | + if (isset($this->_req_data['download_results'])) { |
|
| 982 | + $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params); |
|
| 983 | + header('Content-Disposition: attachment'); |
|
| 984 | + header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url())); |
|
| 985 | + echo "<h1>Payment Logs for " . site_url() . "</h1>"; |
|
| 986 | + echo "<h3>Query:</h3>"; |
|
| 987 | + var_dump($query_params); |
|
| 988 | + echo "<h3>Results:</h3>"; |
|
| 989 | + var_dump($wpdb_results); |
|
| 990 | + die; |
|
| 991 | + } |
|
| 992 | + $results = EEM_Change_Log::instance()->get_all($query_params); |
|
| 993 | + return $results; |
|
| 994 | + } |
|
| 995 | + |
|
| 996 | + |
|
| 997 | + |
|
| 998 | + /** |
|
| 999 | + * Used by usort to RE-sort log query results, because we lose the ordering |
|
| 1000 | + * because we're possibly combining the results from two queries |
|
| 1001 | + * |
|
| 1002 | + * @param EE_Change_Log $logA |
|
| 1003 | + * @param EE_Change_Log $logB |
|
| 1004 | + * @return int |
|
| 1005 | + */ |
|
| 1006 | + protected function _sort_logs_again($logA, $logB) |
|
| 1007 | + { |
|
| 1008 | + $timeA = $logA->get_raw('LOG_time'); |
|
| 1009 | + $timeB = $logB->get_raw('LOG_time'); |
|
| 1010 | + if ($timeA == $timeB) { |
|
| 1011 | + return 0; |
|
| 1012 | + } |
|
| 1013 | + $comparison = $timeA < $timeB ? -1 : 1; |
|
| 1014 | + if (strtoupper($this->_sort_logs_again_direction) == 'DESC') { |
|
| 1015 | + return $comparison * -1; |
|
| 1016 | + } else { |
|
| 1017 | + return $comparison; |
|
| 1018 | + } |
|
| 1019 | + } |
|
| 1020 | + |
|
| 1021 | + |
|
| 1022 | + |
|
| 1023 | + protected function _payment_log_details() |
|
| 1024 | + { |
|
| 1025 | + EE_Registry::instance()->load_model('Change_Log'); |
|
| 1026 | + /** @var $payment_log EE_Change_Log */ |
|
| 1027 | + $payment_log = EEM_Change_Log::instance()->get_one_by_ID($this->_req_data['ID']); |
|
| 1028 | + $payment_method = null; |
|
| 1029 | + $transaction = null; |
|
| 1030 | + if ($payment_log instanceof EE_Change_Log) { |
|
| 1031 | + if ($payment_log->object() instanceof EE_Payment) { |
|
| 1032 | + $payment_method = $payment_log->object()->payment_method(); |
|
| 1033 | + $transaction = $payment_log->object()->transaction(); |
|
| 1034 | + } elseif ($payment_log->object() instanceof EE_Payment_Method) { |
|
| 1035 | + $payment_method = $payment_log->object(); |
|
| 1036 | + } |
|
| 1037 | + } |
|
| 1038 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
| 1039 | + EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php', |
|
| 1040 | + array( |
|
| 1041 | + 'payment_log' => $payment_log, |
|
| 1042 | + 'payment_method' => $payment_method, |
|
| 1043 | + 'transaction' => $transaction, |
|
| 1044 | + ), |
|
| 1045 | + true |
|
| 1046 | + ); |
|
| 1047 | + $this->display_admin_page_with_sidebar(); |
|
| 1048 | + } |
|
| 1049 | 1049 | |
| 1050 | 1050 | |
| 1051 | 1051 | } //end Payments_Admin_Page class |
@@ -1,5 +1,5 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | -if (! defined('EVENT_ESPRESSO_VERSION')) { |
|
| 2 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
| 3 | 3 | exit('NO direct script access allowed'); |
| 4 | 4 | } |
| 5 | 5 | |
@@ -189,7 +189,7 @@ discard block |
||
| 189 | 189 | $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types(); |
| 190 | 190 | $all_pmt_help_tabs_config = array(); |
| 191 | 191 | foreach ($payment_method_types as $payment_method_type) { |
| 192 | - if (! EE_Registry::instance()->CAP->current_user_can($payment_method_type->cap_name(), |
|
| 192 | + if ( ! EE_Registry::instance()->CAP->current_user_can($payment_method_type->cap_name(), |
|
| 193 | 193 | 'specific_payment_method_type_access') |
| 194 | 194 | ) { |
| 195 | 195 | continue; |
@@ -200,7 +200,7 @@ discard block |
||
| 200 | 200 | $all_pmt_help_tabs_config[$help_tab_name] = array( |
| 201 | 201 | 'title' => $config['title'], |
| 202 | 202 | 'content' => EEH_Template::display_template( |
| 203 | - $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php', |
|
| 203 | + $payment_method_type->file_folder().'help_tabs'.DS.$config['filename'].'.help_tab.php', |
|
| 204 | 204 | $template_args, |
| 205 | 205 | true), |
| 206 | 206 | ); |
@@ -246,7 +246,7 @@ discard block |
||
| 246 | 246 | { |
| 247 | 247 | wp_enqueue_script('ee_admin_js'); |
| 248 | 248 | wp_enqueue_script('ee-text-links'); |
| 249 | - wp_enqueue_script('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js', |
|
| 249 | + wp_enqueue_script('espresso_payments', EE_PAYMENTS_ASSETS_URL.'espresso_payments_admin.js', |
|
| 250 | 250 | array('espresso-ui-theme', 'ee-datepicker'), EVENT_ESPRESSO_VERSION, true); |
| 251 | 251 | } |
| 252 | 252 | |
@@ -255,7 +255,7 @@ discard block |
||
| 255 | 255 | public function load_scripts_styles_default() |
| 256 | 256 | { |
| 257 | 257 | //styles |
| 258 | - wp_register_style('espresso_payments', EE_PAYMENTS_ASSETS_URL . 'ee-payments.css', array(), |
|
| 258 | + wp_register_style('espresso_payments', EE_PAYMENTS_ASSETS_URL.'ee-payments.css', array(), |
|
| 259 | 259 | EVENT_ESPRESSO_VERSION); |
| 260 | 260 | wp_enqueue_style('espresso_payments'); |
| 261 | 261 | wp_enqueue_style('ee-text-links'); |
@@ -283,14 +283,14 @@ discard block |
||
| 283 | 283 | continue; |
| 284 | 284 | } |
| 285 | 285 | //check access |
| 286 | - if (! EE_Registry::instance()->CAP->current_user_can($pmt_obj->cap_name(), |
|
| 286 | + if ( ! EE_Registry::instance()->CAP->current_user_can($pmt_obj->cap_name(), |
|
| 287 | 287 | 'specific_payment_method_type_access') |
| 288 | 288 | ) { |
| 289 | 289 | continue; |
| 290 | 290 | } |
| 291 | 291 | //check for any active pms of that type |
| 292 | 292 | $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name()); |
| 293 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 293 | + if ( ! $payment_method instanceof EE_Payment_Method) { |
|
| 294 | 294 | $payment_method = EE_Payment_Method::new_instance( |
| 295 | 295 | array( |
| 296 | 296 | 'PMD_slug' => sanitize_key($pmt_obj->system_name()), |
@@ -308,7 +308,7 @@ discard block |
||
| 308 | 308 | if ($payment_method instanceof EE_Payment_Method) { |
| 309 | 309 | add_meta_box( |
| 310 | 310 | //html id |
| 311 | - 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 311 | + 'espresso_'.$payment_method->slug().'_payment_settings', |
|
| 312 | 312 | //title |
| 313 | 313 | sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()), |
| 314 | 314 | //callback |
@@ -326,7 +326,7 @@ discard block |
||
| 326 | 326 | $tabs[$payment_method->slug()] = array( |
| 327 | 327 | 'label' => $payment_method->admin_name(), |
| 328 | 328 | 'class' => $payment_method->active() ? 'gateway-active' : '', |
| 329 | - 'href' => 'espresso_' . $payment_method->slug() . '_payment_settings', |
|
| 329 | + 'href' => 'espresso_'.$payment_method->slug().'_payment_settings', |
|
| 330 | 330 | 'title' => __('Modify this Payment Method', 'event_espresso'), |
| 331 | 331 | 'slug' => $payment_method->slug(), |
| 332 | 332 | ); |
@@ -354,7 +354,7 @@ discard block |
||
| 354 | 354 | } |
| 355 | 355 | $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug))); |
| 356 | 356 | // if that didn't work or wasn't provided, find another way to select the current pm |
| 357 | - if (! $this->_verify_payment_method($payment_method)) { |
|
| 357 | + if ( ! $this->_verify_payment_method($payment_method)) { |
|
| 358 | 358 | // like, looking for an active one |
| 359 | 359 | $payment_method = EEM_Payment_Method::instance()->get_one_active('CART'); |
| 360 | 360 | // test that one as well |
@@ -404,7 +404,7 @@ discard block |
||
| 404 | 404 | { |
| 405 | 405 | $payment_method = isset($metabox['args'], $metabox['args']['payment_method']) |
| 406 | 406 | ? $metabox['args']['payment_method'] : null; |
| 407 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 407 | + if ( ! $payment_method instanceof EE_Payment_Method) { |
|
| 408 | 408 | throw new EE_Error(sprintf(__('Payment method metabox setup incorrectly. No Payment method object was supplied', |
| 409 | 409 | 'event_espresso'))); |
| 410 | 410 | } |
@@ -415,7 +415,7 @@ discard block |
||
| 415 | 415 | if ($form->form_data_present_in($this->_req_data)) { |
| 416 | 416 | $form->receive_form_submission($this->_req_data); |
| 417 | 417 | } |
| 418 | - echo $form->form_open() . $form->get_html_and_js() . $form->form_close(); |
|
| 418 | + echo $form->form_open().$form->get_html_and_js().$form->form_close(); |
|
| 419 | 419 | } else { |
| 420 | 420 | echo $this->_activate_payment_method_button($payment_method)->get_html_and_js(); |
| 421 | 421 | } |
@@ -432,13 +432,13 @@ discard block |
||
| 432 | 432 | */ |
| 433 | 433 | protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method) |
| 434 | 434 | { |
| 435 | - if (! $payment_method instanceof EE_Payment_Method) { |
|
| 435 | + if ( ! $payment_method instanceof EE_Payment_Method) { |
|
| 436 | 436 | return new EE_Form_Section_Proper(); |
| 437 | 437 | } |
| 438 | 438 | return new EE_Form_Section_Proper( |
| 439 | 439 | array( |
| 440 | - 'name' => $payment_method->slug() . '_settings_form', |
|
| 441 | - 'html_id' => $payment_method->slug() . '_settings_form', |
|
| 440 | + 'name' => $payment_method->slug().'_settings_form', |
|
| 441 | + 'html_id' => $payment_method->slug().'_settings_form', |
|
| 442 | 442 | 'action' => EE_Admin_Page::add_query_args_and_nonce( |
| 443 | 443 | array( |
| 444 | 444 | 'action' => 'update_payment_method', |
@@ -481,7 +481,7 @@ discard block |
||
| 481 | 481 | EEH_HTML::label( |
| 482 | 482 | EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
| 483 | 483 | ) |
| 484 | - ) . |
|
| 484 | + ). |
|
| 485 | 485 | EEH_HTML::td( |
| 486 | 486 | EEH_HTML::strong(__('You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.', |
| 487 | 487 | 'event_espresso')) |
@@ -510,14 +510,14 @@ discard block |
||
| 510 | 510 | */ |
| 511 | 511 | protected function _currency_support(EE_Payment_Method $payment_method) |
| 512 | 512 | { |
| 513 | - if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) { |
|
| 513 | + if ( ! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) { |
|
| 514 | 514 | return new EE_Form_Section_HTML( |
| 515 | 515 | EEH_HTML::tr( |
| 516 | 516 | EEH_HTML::th( |
| 517 | 517 | EEH_HTML::label( |
| 518 | 518 | EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice') |
| 519 | 519 | ) |
| 520 | - ) . |
|
| 520 | + ). |
|
| 521 | 521 | EEH_HTML::td( |
| 522 | 522 | EEH_HTML::strong( |
| 523 | 523 | sprintf( |
@@ -591,16 +591,16 @@ discard block |
||
| 591 | 591 | $update_button = new EE_Submit_Input( |
| 592 | 592 | array( |
| 593 | 593 | 'name' => 'submit', |
| 594 | - 'html_id' => 'save_' . $payment_method->slug() . '_settings', |
|
| 594 | + 'html_id' => 'save_'.$payment_method->slug().'_settings', |
|
| 595 | 595 | 'default' => sprintf(__('Update %s Payment Settings', 'event_espresso'), |
| 596 | 596 | $payment_method->admin_name()), |
| 597 | 597 | 'html_label' => EEH_HTML::nbsp(), |
| 598 | 598 | ) |
| 599 | 599 | ); |
| 600 | 600 | return new EE_Form_Section_HTML( |
| 601 | - EEH_HTML::no_row(EEH_HTML::br(2)) . |
|
| 601 | + EEH_HTML::no_row(EEH_HTML::br(2)). |
|
| 602 | 602 | EEH_HTML::tr( |
| 603 | - EEH_HTML::th(__('Update Settings', 'event_espresso')) . |
|
| 603 | + EEH_HTML::th(__('Update Settings', 'event_espresso')). |
|
| 604 | 604 | EEH_HTML::td( |
| 605 | 605 | $update_button->get_html_for_input() |
| 606 | 606 | ) |
@@ -623,7 +623,7 @@ discard block |
||
| 623 | 623 | $payment_method->admin_name()); |
| 624 | 624 | return new EE_Form_Section_HTML( |
| 625 | 625 | EEH_HTML::tr( |
| 626 | - EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) . |
|
| 626 | + EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')). |
|
| 627 | 627 | EEH_HTML::td( |
| 628 | 628 | EEH_HTML::link( |
| 629 | 629 | EE_Admin_Page::add_query_args_and_nonce( |
@@ -635,7 +635,7 @@ discard block |
||
| 635 | 635 | ), |
| 636 | 636 | $link_text_and_title, |
| 637 | 637 | $link_text_and_title, |
| 638 | - 'deactivate_' . $payment_method->slug(), |
|
| 638 | + 'deactivate_'.$payment_method->slug(), |
|
| 639 | 639 | 'espresso-button button-secondary' |
| 640 | 640 | ) |
| 641 | 641 | ) |
@@ -658,8 +658,8 @@ discard block |
||
| 658 | 658 | $payment_method->admin_name()); |
| 659 | 659 | return new EE_Form_Section_Proper( |
| 660 | 660 | array( |
| 661 | - 'name' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 662 | - 'html_id' => 'activate_' . $payment_method->slug() . '_settings_form', |
|
| 661 | + 'name' => 'activate_'.$payment_method->slug().'_settings_form', |
|
| 662 | + 'html_id' => 'activate_'.$payment_method->slug().'_settings_form', |
|
| 663 | 663 | 'action' => '#', |
| 664 | 664 | 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
| 665 | 665 | 'subsections' => apply_filters( |
@@ -673,11 +673,11 @@ discard block |
||
| 673 | 673 | '', |
| 674 | 674 | 'colspan="2"' |
| 675 | 675 | ) |
| 676 | - ) . |
|
| 676 | + ). |
|
| 677 | 677 | EEH_HTML::tr( |
| 678 | 678 | EEH_HTML::th( |
| 679 | 679 | EEH_HTML::label(__('Click to Activate ', 'event_espresso')) |
| 680 | - ) . |
|
| 680 | + ). |
|
| 681 | 681 | EEH_HTML::td( |
| 682 | 682 | EEH_HTML::link( |
| 683 | 683 | EE_Admin_Page::add_query_args_and_nonce( |
@@ -689,7 +689,7 @@ discard block |
||
| 689 | 689 | ), |
| 690 | 690 | $link_text_and_title, |
| 691 | 691 | $link_text_and_title, |
| 692 | - 'activate_' . $payment_method->slug(), |
|
| 692 | + 'activate_'.$payment_method->slug(), |
|
| 693 | 693 | 'espresso-button-green button-primary' |
| 694 | 694 | ) |
| 695 | 695 | ) |
@@ -714,7 +714,7 @@ discard block |
||
| 714 | 714 | { |
| 715 | 715 | return new EE_Form_Section_HTML( |
| 716 | 716 | EEH_HTML::tr( |
| 717 | - EEH_HTML::th() . |
|
| 717 | + EEH_HTML::th(). |
|
| 718 | 718 | EEH_HTML::td( |
| 719 | 719 | EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text') |
| 720 | 720 | ) |
@@ -792,7 +792,7 @@ discard block |
||
| 792 | 792 | } |
| 793 | 793 | } |
| 794 | 794 | //if we couldn't find the correct payment method type... |
| 795 | - if (! $correct_pmt_form_to_use) { |
|
| 795 | + if ( ! $correct_pmt_form_to_use) { |
|
| 796 | 796 | EE_Error::add_error(__("We could not find which payment method type your form submission related to. Please contact support", |
| 797 | 797 | 'event_espresso'), __FILE__, __FUNCTION__, __LINE__); |
| 798 | 798 | $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default')); |
@@ -800,7 +800,7 @@ discard block |
||
| 800 | 800 | $correct_pmt_form_to_use->receive_form_submission($this->_req_data); |
| 801 | 801 | if ($correct_pmt_form_to_use->is_valid()) { |
| 802 | 802 | $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings'); |
| 803 | - if (! $payment_settings_subform instanceof EE_Payment_Method_Form) { |
|
| 803 | + if ( ! $payment_settings_subform instanceof EE_Payment_Method_Form) { |
|
| 804 | 804 | throw new EE_Error( |
| 805 | 805 | sprintf( |
| 806 | 806 | __('The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.', |
@@ -926,7 +926,7 @@ discard block |
||
| 926 | 926 | } |
| 927 | 927 | //take into account search |
| 928 | 928 | if (isset($this->_req_data['s']) && $this->_req_data['s']) { |
| 929 | - $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%'); |
|
| 929 | + $similarity_string = array('LIKE', '%'.str_replace("", "%", $this->_req_data['s']).'%'); |
|
| 930 | 930 | $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string; |
| 931 | 931 | $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string; |
| 932 | 932 | $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string; |
@@ -946,8 +946,8 @@ discard block |
||
| 946 | 946 | $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']); |
| 947 | 947 | $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']); |
| 948 | 948 | //make sure our timestamps start and end right at the boundaries for each day |
| 949 | - $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00'; |
|
| 950 | - $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59'; |
|
| 949 | + $start_date = date('Y-m-d', strtotime($start_date)).' 00:00:00'; |
|
| 950 | + $end_date = date('Y-m-d', strtotime($end_date)).' 23:59:59'; |
|
| 951 | 951 | //convert to timestamps |
| 952 | 952 | $start_date = strtotime($start_date); |
| 953 | 953 | $end_date = strtotime($end_date); |
@@ -974,15 +974,15 @@ discard block |
||
| 974 | 974 | $query_params['order_by'] = array('LOG_time' => 'DESC'); |
| 975 | 975 | } |
| 976 | 976 | $offset = ($current_page - 1) * $per_page; |
| 977 | - if (! isset($this->_req_data['download_results'])) { |
|
| 977 | + if ( ! isset($this->_req_data['download_results'])) { |
|
| 978 | 978 | $query_params['limit'] = array($offset, $per_page); |
| 979 | 979 | } |
| 980 | 980 | //now they've requested to instead just download the file instead of viewing it. |
| 981 | 981 | if (isset($this->_req_data['download_results'])) { |
| 982 | 982 | $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params); |
| 983 | 983 | header('Content-Disposition: attachment'); |
| 984 | - header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url())); |
|
| 985 | - echo "<h1>Payment Logs for " . site_url() . "</h1>"; |
|
| 984 | + header("Content-Disposition: attachment; filename=ee_payment_logs_for_".sanitize_key(site_url())); |
|
| 985 | + echo "<h1>Payment Logs for ".site_url()."</h1>"; |
|
| 986 | 986 | echo "<h3>Query:</h3>"; |
| 987 | 987 | var_dump($query_params); |
| 988 | 988 | echo "<h3>Results:</h3>"; |
@@ -1036,7 +1036,7 @@ discard block |
||
| 1036 | 1036 | } |
| 1037 | 1037 | } |
| 1038 | 1038 | $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
| 1039 | - EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php', |
|
| 1039 | + EE_PAYMENTS_TEMPLATE_PATH.'payment_log_details.template.php', |
|
| 1040 | 1040 | array( |
| 1041 | 1041 | 'payment_log' => $payment_log, |
| 1042 | 1042 | 'payment_method' => $payment_method, |
@@ -14,439 +14,439 @@ |
||
| 14 | 14 | class EE_Model_Form_Section extends EE_Form_Section_Proper |
| 15 | 15 | { |
| 16 | 16 | |
| 17 | - /** |
|
| 18 | - * @var EEM_Base |
|
| 19 | - */ |
|
| 20 | - protected $_model = null; |
|
| 21 | - |
|
| 22 | - /** |
|
| 23 | - * @var EE_Base_Class |
|
| 24 | - */ |
|
| 25 | - protected $_model_object = null; |
|
| 26 | - |
|
| 27 | - |
|
| 28 | - |
|
| 29 | - /** |
|
| 30 | - * @param array $options_array keys: { |
|
| 31 | - * @type EEM_Base $model |
|
| 32 | - * @type EE_Base_Class $model_object |
|
| 33 | - * @type array $subsection_args array keys should be subsection names (that either do or will exist), and |
|
| 34 | - * values are the arrays as you would pass them to that subsection |
|
| 35 | - * } |
|
| 36 | - * @throws EE_Error |
|
| 37 | - */ |
|
| 38 | - public function __construct($options_array = array()) |
|
| 39 | - { |
|
| 40 | - if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) { |
|
| 41 | - $this->_model = $options_array['model']; |
|
| 42 | - } |
|
| 43 | - if (! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
| 44 | - throw new EE_Error(sprintf(__("Model Form Sections must first specify the _model property to be a subclass of EEM_Base", |
|
| 45 | - "event_espresso"))); |
|
| 46 | - } |
|
| 47 | - if (isset($options_array['subsection_args'])) { |
|
| 48 | - $subsection_args = $options_array['subsection_args']; |
|
| 49 | - } else { |
|
| 50 | - $subsection_args = array(); |
|
| 51 | - } |
|
| 52 | - //gather fields and relations to convert to inputs |
|
| 53 | - //but if they're just going to exclude a field anyways, don't bother converting it to an input |
|
| 54 | - $exclude = $this->_subsections; |
|
| 55 | - if (isset($options_array['exclude'])) { |
|
| 56 | - $exclude = array_merge($exclude, array_flip($options_array['exclude'])); |
|
| 57 | - } |
|
| 58 | - $model_fields = array_diff_key($this->_model->field_settings(), $exclude); |
|
| 59 | - $model_relations = array_diff_key($this->_model->relation_settings(), $exclude); |
|
| 60 | - //convert fields and relations to inputs |
|
| 61 | - $this->_subsections = array_merge( |
|
| 62 | - $this->_convert_model_fields_to_inputs($model_fields), |
|
| 63 | - $this->_convert_model_relations_to_inputs($model_relations, $subsection_args), |
|
| 64 | - $this->_subsections |
|
| 65 | - ); |
|
| 66 | - parent::__construct($options_array); |
|
| 67 | - if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) { |
|
| 68 | - $this->populate_model_obj($options_array['model_object']); |
|
| 69 | - } |
|
| 70 | - } |
|
| 71 | - |
|
| 72 | - |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * For now, just makes inputs for only HABTM relations |
|
| 76 | - * |
|
| 77 | - * @param EE_Model_Relation_Base[] $relations |
|
| 78 | - * @param array $subsection_args keys should be existing or soon-to-be-existing input names, and |
|
| 79 | - * their values are { |
|
| 80 | - * @type array { |
|
| 81 | - * @type EE_Base_Class[] $model_objects if the subsection is an EE_Select_Multi_Model_Input |
|
| 82 | - * } |
|
| 83 | - * } |
|
| 84 | - * @return array |
|
| 85 | - */ |
|
| 86 | - protected function _convert_model_relations_to_inputs($relations, $subsection_args = array()) |
|
| 87 | - { |
|
| 88 | - $inputs = array(); |
|
| 89 | - foreach ($relations as $relation_name => $relation_obj) { |
|
| 90 | - $input_constructor_args = array( |
|
| 91 | - array_merge( |
|
| 92 | - array( |
|
| 93 | - 'required' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
| 94 | - 'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation |
|
| 95 | - ? $relation_obj->get_other_model()->item_name(1) |
|
| 96 | - : $relation_obj->get_other_model() |
|
| 97 | - ->item_name(2), |
|
| 98 | - ), |
|
| 99 | - $subsection_args |
|
| 100 | - ), |
|
| 101 | - ); |
|
| 102 | - $input = null; |
|
| 103 | - switch (get_class($relation_obj)) { |
|
| 104 | - case 'EE_HABTM_Relation': |
|
| 105 | - if (isset($subsection_args[$relation_name]) |
|
| 106 | - && isset($subsection_args[$relation_name]['model_objects']) |
|
| 107 | - ) { |
|
| 108 | - $model_objects = $subsection_args[$relation_name]['model_objects']; |
|
| 109 | - } else { |
|
| 110 | - $model_objects = $relation_obj->get_other_model()->get_all(); |
|
| 111 | - } |
|
| 112 | - $input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args); |
|
| 113 | - break; |
|
| 114 | - default: |
|
| 115 | - } |
|
| 116 | - if ($input) { |
|
| 117 | - $inputs[$relation_name] = $input; |
|
| 118 | - } |
|
| 119 | - } |
|
| 120 | - return $inputs; |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - |
|
| 124 | - |
|
| 125 | - /** |
|
| 126 | - * Changes model fields into form section inputs |
|
| 127 | - * |
|
| 128 | - * @param EE_Model_Field_Base[] $model_fields keys are the model's name |
|
| 129 | - * @throws EE_Error |
|
| 130 | - * @return EE_Form_Input_Base[] |
|
| 131 | - */ |
|
| 132 | - protected function _convert_model_fields_to_inputs($model_fields = array()) |
|
| 133 | - { |
|
| 134 | - $inputs = array(); |
|
| 135 | - foreach ($model_fields as $field_name => $model_field) { |
|
| 136 | - if ($model_field instanceof EE_Model_Field_Base) { |
|
| 137 | - $input_constructor_args = array( |
|
| 138 | - array( |
|
| 139 | - 'required' => ! $model_field->is_nullable() |
|
| 140 | - && $model_field->get_default_value() |
|
| 141 | - === null, |
|
| 142 | - 'html_label_text' => $model_field->get_nicename(), |
|
| 143 | - 'default' => $model_field->get_default_value(), |
|
| 144 | - ), |
|
| 145 | - ); |
|
| 146 | - switch (get_class($model_field)) { |
|
| 147 | - case 'EE_All_Caps_Text_Field': |
|
| 148 | - case 'EE_Any_Foreign_Model_Name_Field': |
|
| 149 | - $input_class = 'EE_Text_Input'; |
|
| 150 | - break; |
|
| 151 | - case 'EE_Boolean_Field': |
|
| 152 | - $input_class = 'EE_Yes_No_Input'; |
|
| 153 | - break; |
|
| 154 | - case 'EE_Datetime_Field': |
|
| 155 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 156 | - "event_espresso"), get_class($model_field))); |
|
| 157 | - break; |
|
| 158 | - case 'EE_Email_Field': |
|
| 159 | - $input_class = 'EE_Email_Input'; |
|
| 160 | - break; |
|
| 161 | - case 'EE_Enum_Integer_Field': |
|
| 162 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 163 | - "event_espresso"), get_class($model_field))); |
|
| 164 | - break; |
|
| 165 | - case 'EE_Enum_Text_Field': |
|
| 166 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 167 | - "event_espresso"), get_class($model_field))); |
|
| 168 | - break; |
|
| 169 | - case 'EE_Float_Field': |
|
| 170 | - $input_class = 'EE_Float_Input'; |
|
| 171 | - break; |
|
| 172 | - case 'EE_Foreign_Key_Int_Field': |
|
| 173 | - case 'EE_Foreign_Key_String_Field': |
|
| 174 | - case 'EE_WP_User_Field': |
|
| 175 | - $models_pointed_to = $model_field instanceof EE_Field_With_Model_Name |
|
| 176 | - ? $model_field->get_model_class_names_pointed_to() : array(); |
|
| 177 | - if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) { |
|
| 178 | - $input_class = 'EE_Text_Input'; |
|
| 179 | - } else { |
|
| 180 | - //so its just one model |
|
| 181 | - $model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to; |
|
| 182 | - $model = EE_Registry::instance()->load_model($model_name); |
|
| 183 | - $model_names = $model->get_all_names(array('limit' => 10)); |
|
| 184 | - if ($model_field->is_nullable()) { |
|
| 185 | - array_unshift($model_names, __("Please Select", 'event_espresso')); |
|
| 186 | - } |
|
| 187 | - $input_constructor_args[1] = $input_constructor_args[0]; |
|
| 188 | - $input_constructor_args[0] = $model_names; |
|
| 189 | - $input_class = 'EE_Select_Input'; |
|
| 190 | - } |
|
| 191 | - break; |
|
| 192 | - case 'EE_Full_HTML_Field': |
|
| 193 | - $input_class = 'EE_Text_Area_Input'; |
|
| 194 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
| 195 | - break; |
|
| 196 | - case 'EE_Infinite_Integer': |
|
| 197 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 198 | - "event_espresso"), get_class($model_field))); |
|
| 199 | - break; |
|
| 200 | - case 'EE_Integer_Field': |
|
| 201 | - $input_class = 'EE_Text_Input'; |
|
| 202 | - break; |
|
| 203 | - case 'EE_Maybe_Serialized_Text_Field': |
|
| 204 | - $input_class = 'EE_Text_Area_Input'; |
|
| 205 | - break; |
|
| 206 | - case 'EE_Money_Field': |
|
| 207 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 208 | - "event_espresso"), get_class($model_field))); |
|
| 209 | - break; |
|
| 210 | - case 'EE_Post_Content_Field': |
|
| 211 | - $input_class = 'EE_Text_Area_Input'; |
|
| 212 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
| 213 | - break; |
|
| 214 | - case 'EE_Plain_Text_Field': |
|
| 215 | - $input_class = 'EE_Text_Input'; |
|
| 216 | - break; |
|
| 217 | - case 'EE_Primary_Key_Int_Field': |
|
| 218 | - $input_class = 'EE_Hidden_Input'; |
|
| 219 | - $input_constructor_args['normalization_strategy'] = new EE_Int_Normalization(); |
|
| 220 | - break; |
|
| 221 | - case 'EE_Primary_Key_String_Field': |
|
| 222 | - $input_class = 'EE_Hidden_Input'; |
|
| 223 | - break; |
|
| 224 | - case 'EE_Serialized_Text_Field': |
|
| 225 | - $input_class = 'EE_Text_Area_Input'; |
|
| 226 | - break; |
|
| 227 | - case 'EE_Simple_HTML_Field': |
|
| 228 | - $input_class = 'EE_Text_Area_Input'; |
|
| 229 | - $input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy()); |
|
| 230 | - break; |
|
| 231 | - case 'EE_Slug_Field': |
|
| 232 | - $input_class = 'EE_Text_Input'; |
|
| 233 | - break; |
|
| 234 | - case 'EE_Trashed_Flag_Field': |
|
| 235 | - $input_class = 'EE_Yes_No_Input'; |
|
| 236 | - break; |
|
| 237 | - case 'EE_WP_Post_Status_Field': |
|
| 238 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 239 | - "event_espresso"), get_class($model_field))); |
|
| 240 | - break; |
|
| 241 | - case 'EE_WP_Post_Type_Field': |
|
| 242 | - throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 243 | - "event_espresso"), get_class($model_field))); |
|
| 244 | - break; |
|
| 245 | - default: |
|
| 246 | - throw new EE_Error(sprintf(__("Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement", |
|
| 247 | - "event_espresso"), get_class($model_field))); |
|
| 248 | - } |
|
| 249 | - $reflection = new ReflectionClass($input_class); |
|
| 250 | - $input = $reflection->newInstanceArgs($input_constructor_args); |
|
| 251 | - $inputs[$field_name] = $input; |
|
| 252 | - } |
|
| 253 | - } |
|
| 254 | - return $inputs; |
|
| 255 | - } |
|
| 256 | - |
|
| 257 | - |
|
| 258 | - |
|
| 259 | - /** |
|
| 260 | - * Mostly the same as populate_defaults , except takes a model object as input, not an array, |
|
| 261 | - * and also sets the form's _model_object |
|
| 262 | - * |
|
| 263 | - * @param EE_Base_Class $model_obj |
|
| 264 | - * @return void |
|
| 265 | - */ |
|
| 266 | - public function populate_model_obj($model_obj) |
|
| 267 | - { |
|
| 268 | - $model_obj = $this->_model->ensure_is_obj($model_obj); |
|
| 269 | - $this->_model_object = $model_obj; |
|
| 270 | - $defaults = $model_obj->model_field_array(); |
|
| 271 | - foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
| 272 | - $subsection = $this->get_subsection($relation_name, false); |
|
| 273 | - if ($subsection instanceof EE_Form_Input_Base) { |
|
| 274 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 275 | - //then we only expect there to be one |
|
| 276 | - $related_item = $this->_model_object->get_first_related($relation_name); |
|
| 277 | - $defaults[$relation_name] = $related_item->ID(); |
|
| 278 | - } else { |
|
| 279 | - $related_items = $this->_model_object->get_many_related($relation_name); |
|
| 280 | - $ids = array(); |
|
| 281 | - foreach ($related_items as $related_item) { |
|
| 282 | - $ids[] = $related_item->ID(); |
|
| 283 | - } |
|
| 284 | - $defaults[$relation_name] = $ids; |
|
| 285 | - } |
|
| 286 | - } |
|
| 287 | - } |
|
| 288 | - $defaults = apply_filters( |
|
| 289 | - 'FHEE__EE_Model_Form_Section__populate_model_obj', |
|
| 290 | - $defaults, |
|
| 291 | - $this |
|
| 292 | - ); |
|
| 293 | - $this->populate_defaults($defaults); |
|
| 294 | - } |
|
| 295 | - |
|
| 296 | - |
|
| 297 | - |
|
| 298 | - /** |
|
| 299 | - * Gets all the input values that correspond to model fields. Keys are the input/field names, |
|
| 300 | - * values are their normalized values |
|
| 301 | - * |
|
| 302 | - * @return array |
|
| 303 | - */ |
|
| 304 | - public function inputs_values_corresponding_to_model_fields() |
|
| 305 | - { |
|
| 306 | - return array_intersect_key($this->input_values(), $this->_model->field_settings()); |
|
| 307 | - } |
|
| 308 | - |
|
| 309 | - |
|
| 310 | - |
|
| 311 | - /** |
|
| 312 | - * After we've normalized the data as normal, set the corresponding model object |
|
| 313 | - * on the form. |
|
| 314 | - * |
|
| 315 | - * @param array $req_data should usually be $_REQUEST (the default). |
|
| 316 | - * @return void |
|
| 317 | - */ |
|
| 318 | - public function _normalize($req_data) |
|
| 319 | - { |
|
| 320 | - parent::_normalize($req_data); |
|
| 321 | - //create or set the model object, if it isn't already |
|
| 322 | - if (! $this->_model_object) { |
|
| 323 | - //check to see if the form indicates a PK, in which case we want to only retrieve it and update it |
|
| 324 | - $pk_name = $this->_model->primary_key_name(); |
|
| 325 | - $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name)); |
|
| 326 | - if ($model_obj) { |
|
| 327 | - $this->_model_object = $model_obj; |
|
| 328 | - } else { |
|
| 329 | - $this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name()); |
|
| 330 | - } |
|
| 331 | - } |
|
| 332 | - } |
|
| 333 | - |
|
| 334 | - |
|
| 335 | - |
|
| 336 | - /** |
|
| 337 | - * After this form has been initialized and is verified to be valid, |
|
| 338 | - * either creates a model object from its data and saves it, or updates |
|
| 339 | - * the model object its data represents |
|
| 340 | - * |
|
| 341 | - * @throws EE_Error |
|
| 342 | - * @return int, 1 on a successful update, the ID of |
|
| 343 | - * the new entry on insert; 0 on failure |
|
| 344 | - */ |
|
| 345 | - public function save() |
|
| 346 | - { |
|
| 347 | - if (! $this->_model_object) { |
|
| 348 | - throw new EE_Error(sprintf(__("Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically", |
|
| 349 | - "event_espresso"), get_class($this->_model))); |
|
| 350 | - } |
|
| 351 | - //ok so the model object is set. Just set it with the submitted form data |
|
| 352 | - foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) { |
|
| 353 | - //only set the non-primary key |
|
| 354 | - if ($field_name != $this->_model->primary_key_name()) { |
|
| 355 | - $this->_model_object->set($field_name, $field_value); |
|
| 356 | - } |
|
| 357 | - } |
|
| 358 | - $success = $this->_model_object->save(); |
|
| 359 | - foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
| 360 | - if (isset($this->_subsections[$relation_name])) { |
|
| 361 | - $success = $this->_save_related_info($relation_name); |
|
| 362 | - } |
|
| 363 | - } |
|
| 364 | - do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success); |
|
| 365 | - return $success; |
|
| 366 | - } |
|
| 367 | - |
|
| 368 | - |
|
| 369 | - |
|
| 370 | - /** |
|
| 371 | - * Automatically finds the related model info from the form, if present, and |
|
| 372 | - * save the relations indicated |
|
| 373 | - * |
|
| 374 | - * @type string $relation_name |
|
| 375 | - * @return bool |
|
| 376 | - * @throws EE_Error |
|
| 377 | - */ |
|
| 378 | - protected function _save_related_info($relation_name) |
|
| 379 | - { |
|
| 380 | - $relation_obj = $this->_model->related_settings_for($relation_name); |
|
| 381 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 382 | - //there is just a foreign key on this model pointing to that one |
|
| 383 | - $this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name); |
|
| 384 | - } elseif ($relation_obj instanceof EE_Has_Many_Relation) { |
|
| 385 | - //then we want to consider all of its currently-related things. |
|
| 386 | - //if they're in this list, keep them |
|
| 387 | - //if they're not in this list, remove them |
|
| 388 | - //and lastly add all the new items |
|
| 389 | - throw new EE_Error(sprintf(__('Automatic saving of related info across a "has many" relation is not yet supported', |
|
| 390 | - "event_espresso"))); |
|
| 391 | - } elseif ($relation_obj instanceof EE_HABTM_Relation) { |
|
| 392 | - //delete everything NOT in this list |
|
| 393 | - $normalized_input_value = $this->get_input_value($relation_name); |
|
| 394 | - if ($normalized_input_value && is_array($normalized_input_value)) { |
|
| 395 | - $where_query_params = array( |
|
| 396 | - $relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value), |
|
| 397 | - ); |
|
| 398 | - } else { |
|
| 399 | - $where_query_params = array(); |
|
| 400 | - } |
|
| 401 | - $this->_model_object->_remove_relations($relation_name, $where_query_params); |
|
| 402 | - foreach ($normalized_input_value as $id) { |
|
| 403 | - $this->_model_object->_add_relation_to($id, $relation_name); |
|
| 404 | - } |
|
| 405 | - } |
|
| 406 | - return true; |
|
| 407 | - } |
|
| 408 | - |
|
| 409 | - |
|
| 410 | - |
|
| 411 | - /** |
|
| 412 | - * Gets the model of this model form |
|
| 413 | - * |
|
| 414 | - * @return EEM_Base |
|
| 415 | - */ |
|
| 416 | - public function get_model() |
|
| 417 | - { |
|
| 418 | - return $this->_model; |
|
| 419 | - } |
|
| 420 | - |
|
| 421 | - |
|
| 422 | - |
|
| 423 | - /** |
|
| 424 | - * Gets the model object for this model form, which was either set |
|
| 425 | - * upon construction (using the $options_array arg 'model_object'), by using |
|
| 426 | - * set_model_object($model_obj), or implicitly |
|
| 427 | - * when receive_form_submission($req_data) was called. |
|
| 428 | - * |
|
| 429 | - * @return EE_Base_Class |
|
| 430 | - */ |
|
| 431 | - public function get_model_object() |
|
| 432 | - { |
|
| 433 | - return $this->_model_object; |
|
| 434 | - } |
|
| 435 | - |
|
| 436 | - |
|
| 437 | - |
|
| 438 | - /** |
|
| 439 | - * gets teh default name of this form section if none is specified |
|
| 440 | - * |
|
| 441 | - * @return string |
|
| 442 | - */ |
|
| 443 | - protected function _set_default_name_if_empty() |
|
| 444 | - { |
|
| 445 | - if (! $this->_name) { |
|
| 446 | - $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form"; |
|
| 447 | - $this->_name = $default_name; |
|
| 448 | - } |
|
| 449 | - } |
|
| 17 | + /** |
|
| 18 | + * @var EEM_Base |
|
| 19 | + */ |
|
| 20 | + protected $_model = null; |
|
| 21 | + |
|
| 22 | + /** |
|
| 23 | + * @var EE_Base_Class |
|
| 24 | + */ |
|
| 25 | + protected $_model_object = null; |
|
| 26 | + |
|
| 27 | + |
|
| 28 | + |
|
| 29 | + /** |
|
| 30 | + * @param array $options_array keys: { |
|
| 31 | + * @type EEM_Base $model |
|
| 32 | + * @type EE_Base_Class $model_object |
|
| 33 | + * @type array $subsection_args array keys should be subsection names (that either do or will exist), and |
|
| 34 | + * values are the arrays as you would pass them to that subsection |
|
| 35 | + * } |
|
| 36 | + * @throws EE_Error |
|
| 37 | + */ |
|
| 38 | + public function __construct($options_array = array()) |
|
| 39 | + { |
|
| 40 | + if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) { |
|
| 41 | + $this->_model = $options_array['model']; |
|
| 42 | + } |
|
| 43 | + if (! $this->_model || ! $this->_model instanceof EEM_Base) { |
|
| 44 | + throw new EE_Error(sprintf(__("Model Form Sections must first specify the _model property to be a subclass of EEM_Base", |
|
| 45 | + "event_espresso"))); |
|
| 46 | + } |
|
| 47 | + if (isset($options_array['subsection_args'])) { |
|
| 48 | + $subsection_args = $options_array['subsection_args']; |
|
| 49 | + } else { |
|
| 50 | + $subsection_args = array(); |
|
| 51 | + } |
|
| 52 | + //gather fields and relations to convert to inputs |
|
| 53 | + //but if they're just going to exclude a field anyways, don't bother converting it to an input |
|
| 54 | + $exclude = $this->_subsections; |
|
| 55 | + if (isset($options_array['exclude'])) { |
|
| 56 | + $exclude = array_merge($exclude, array_flip($options_array['exclude'])); |
|
| 57 | + } |
|
| 58 | + $model_fields = array_diff_key($this->_model->field_settings(), $exclude); |
|
| 59 | + $model_relations = array_diff_key($this->_model->relation_settings(), $exclude); |
|
| 60 | + //convert fields and relations to inputs |
|
| 61 | + $this->_subsections = array_merge( |
|
| 62 | + $this->_convert_model_fields_to_inputs($model_fields), |
|
| 63 | + $this->_convert_model_relations_to_inputs($model_relations, $subsection_args), |
|
| 64 | + $this->_subsections |
|
| 65 | + ); |
|
| 66 | + parent::__construct($options_array); |
|
| 67 | + if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) { |
|
| 68 | + $this->populate_model_obj($options_array['model_object']); |
|
| 69 | + } |
|
| 70 | + } |
|
| 71 | + |
|
| 72 | + |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * For now, just makes inputs for only HABTM relations |
|
| 76 | + * |
|
| 77 | + * @param EE_Model_Relation_Base[] $relations |
|
| 78 | + * @param array $subsection_args keys should be existing or soon-to-be-existing input names, and |
|
| 79 | + * their values are { |
|
| 80 | + * @type array { |
|
| 81 | + * @type EE_Base_Class[] $model_objects if the subsection is an EE_Select_Multi_Model_Input |
|
| 82 | + * } |
|
| 83 | + * } |
|
| 84 | + * @return array |
|
| 85 | + */ |
|
| 86 | + protected function _convert_model_relations_to_inputs($relations, $subsection_args = array()) |
|
| 87 | + { |
|
| 88 | + $inputs = array(); |
|
| 89 | + foreach ($relations as $relation_name => $relation_obj) { |
|
| 90 | + $input_constructor_args = array( |
|
| 91 | + array_merge( |
|
| 92 | + array( |
|
| 93 | + 'required' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
| 94 | + 'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation |
|
| 95 | + ? $relation_obj->get_other_model()->item_name(1) |
|
| 96 | + : $relation_obj->get_other_model() |
|
| 97 | + ->item_name(2), |
|
| 98 | + ), |
|
| 99 | + $subsection_args |
|
| 100 | + ), |
|
| 101 | + ); |
|
| 102 | + $input = null; |
|
| 103 | + switch (get_class($relation_obj)) { |
|
| 104 | + case 'EE_HABTM_Relation': |
|
| 105 | + if (isset($subsection_args[$relation_name]) |
|
| 106 | + && isset($subsection_args[$relation_name]['model_objects']) |
|
| 107 | + ) { |
|
| 108 | + $model_objects = $subsection_args[$relation_name]['model_objects']; |
|
| 109 | + } else { |
|
| 110 | + $model_objects = $relation_obj->get_other_model()->get_all(); |
|
| 111 | + } |
|
| 112 | + $input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args); |
|
| 113 | + break; |
|
| 114 | + default: |
|
| 115 | + } |
|
| 116 | + if ($input) { |
|
| 117 | + $inputs[$relation_name] = $input; |
|
| 118 | + } |
|
| 119 | + } |
|
| 120 | + return $inputs; |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + |
|
| 124 | + |
|
| 125 | + /** |
|
| 126 | + * Changes model fields into form section inputs |
|
| 127 | + * |
|
| 128 | + * @param EE_Model_Field_Base[] $model_fields keys are the model's name |
|
| 129 | + * @throws EE_Error |
|
| 130 | + * @return EE_Form_Input_Base[] |
|
| 131 | + */ |
|
| 132 | + protected function _convert_model_fields_to_inputs($model_fields = array()) |
|
| 133 | + { |
|
| 134 | + $inputs = array(); |
|
| 135 | + foreach ($model_fields as $field_name => $model_field) { |
|
| 136 | + if ($model_field instanceof EE_Model_Field_Base) { |
|
| 137 | + $input_constructor_args = array( |
|
| 138 | + array( |
|
| 139 | + 'required' => ! $model_field->is_nullable() |
|
| 140 | + && $model_field->get_default_value() |
|
| 141 | + === null, |
|
| 142 | + 'html_label_text' => $model_field->get_nicename(), |
|
| 143 | + 'default' => $model_field->get_default_value(), |
|
| 144 | + ), |
|
| 145 | + ); |
|
| 146 | + switch (get_class($model_field)) { |
|
| 147 | + case 'EE_All_Caps_Text_Field': |
|
| 148 | + case 'EE_Any_Foreign_Model_Name_Field': |
|
| 149 | + $input_class = 'EE_Text_Input'; |
|
| 150 | + break; |
|
| 151 | + case 'EE_Boolean_Field': |
|
| 152 | + $input_class = 'EE_Yes_No_Input'; |
|
| 153 | + break; |
|
| 154 | + case 'EE_Datetime_Field': |
|
| 155 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 156 | + "event_espresso"), get_class($model_field))); |
|
| 157 | + break; |
|
| 158 | + case 'EE_Email_Field': |
|
| 159 | + $input_class = 'EE_Email_Input'; |
|
| 160 | + break; |
|
| 161 | + case 'EE_Enum_Integer_Field': |
|
| 162 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 163 | + "event_espresso"), get_class($model_field))); |
|
| 164 | + break; |
|
| 165 | + case 'EE_Enum_Text_Field': |
|
| 166 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 167 | + "event_espresso"), get_class($model_field))); |
|
| 168 | + break; |
|
| 169 | + case 'EE_Float_Field': |
|
| 170 | + $input_class = 'EE_Float_Input'; |
|
| 171 | + break; |
|
| 172 | + case 'EE_Foreign_Key_Int_Field': |
|
| 173 | + case 'EE_Foreign_Key_String_Field': |
|
| 174 | + case 'EE_WP_User_Field': |
|
| 175 | + $models_pointed_to = $model_field instanceof EE_Field_With_Model_Name |
|
| 176 | + ? $model_field->get_model_class_names_pointed_to() : array(); |
|
| 177 | + if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) { |
|
| 178 | + $input_class = 'EE_Text_Input'; |
|
| 179 | + } else { |
|
| 180 | + //so its just one model |
|
| 181 | + $model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to; |
|
| 182 | + $model = EE_Registry::instance()->load_model($model_name); |
|
| 183 | + $model_names = $model->get_all_names(array('limit' => 10)); |
|
| 184 | + if ($model_field->is_nullable()) { |
|
| 185 | + array_unshift($model_names, __("Please Select", 'event_espresso')); |
|
| 186 | + } |
|
| 187 | + $input_constructor_args[1] = $input_constructor_args[0]; |
|
| 188 | + $input_constructor_args[0] = $model_names; |
|
| 189 | + $input_class = 'EE_Select_Input'; |
|
| 190 | + } |
|
| 191 | + break; |
|
| 192 | + case 'EE_Full_HTML_Field': |
|
| 193 | + $input_class = 'EE_Text_Area_Input'; |
|
| 194 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
| 195 | + break; |
|
| 196 | + case 'EE_Infinite_Integer': |
|
| 197 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 198 | + "event_espresso"), get_class($model_field))); |
|
| 199 | + break; |
|
| 200 | + case 'EE_Integer_Field': |
|
| 201 | + $input_class = 'EE_Text_Input'; |
|
| 202 | + break; |
|
| 203 | + case 'EE_Maybe_Serialized_Text_Field': |
|
| 204 | + $input_class = 'EE_Text_Area_Input'; |
|
| 205 | + break; |
|
| 206 | + case 'EE_Money_Field': |
|
| 207 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 208 | + "event_espresso"), get_class($model_field))); |
|
| 209 | + break; |
|
| 210 | + case 'EE_Post_Content_Field': |
|
| 211 | + $input_class = 'EE_Text_Area_Input'; |
|
| 212 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy()); |
|
| 213 | + break; |
|
| 214 | + case 'EE_Plain_Text_Field': |
|
| 215 | + $input_class = 'EE_Text_Input'; |
|
| 216 | + break; |
|
| 217 | + case 'EE_Primary_Key_Int_Field': |
|
| 218 | + $input_class = 'EE_Hidden_Input'; |
|
| 219 | + $input_constructor_args['normalization_strategy'] = new EE_Int_Normalization(); |
|
| 220 | + break; |
|
| 221 | + case 'EE_Primary_Key_String_Field': |
|
| 222 | + $input_class = 'EE_Hidden_Input'; |
|
| 223 | + break; |
|
| 224 | + case 'EE_Serialized_Text_Field': |
|
| 225 | + $input_class = 'EE_Text_Area_Input'; |
|
| 226 | + break; |
|
| 227 | + case 'EE_Simple_HTML_Field': |
|
| 228 | + $input_class = 'EE_Text_Area_Input'; |
|
| 229 | + $input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy()); |
|
| 230 | + break; |
|
| 231 | + case 'EE_Slug_Field': |
|
| 232 | + $input_class = 'EE_Text_Input'; |
|
| 233 | + break; |
|
| 234 | + case 'EE_Trashed_Flag_Field': |
|
| 235 | + $input_class = 'EE_Yes_No_Input'; |
|
| 236 | + break; |
|
| 237 | + case 'EE_WP_Post_Status_Field': |
|
| 238 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 239 | + "event_espresso"), get_class($model_field))); |
|
| 240 | + break; |
|
| 241 | + case 'EE_WP_Post_Type_Field': |
|
| 242 | + throw new EE_Error(sprintf(__("Model field '%s' does not yet have a known conversion to form input", |
|
| 243 | + "event_espresso"), get_class($model_field))); |
|
| 244 | + break; |
|
| 245 | + default: |
|
| 246 | + throw new EE_Error(sprintf(__("Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement", |
|
| 247 | + "event_espresso"), get_class($model_field))); |
|
| 248 | + } |
|
| 249 | + $reflection = new ReflectionClass($input_class); |
|
| 250 | + $input = $reflection->newInstanceArgs($input_constructor_args); |
|
| 251 | + $inputs[$field_name] = $input; |
|
| 252 | + } |
|
| 253 | + } |
|
| 254 | + return $inputs; |
|
| 255 | + } |
|
| 256 | + |
|
| 257 | + |
|
| 258 | + |
|
| 259 | + /** |
|
| 260 | + * Mostly the same as populate_defaults , except takes a model object as input, not an array, |
|
| 261 | + * and also sets the form's _model_object |
|
| 262 | + * |
|
| 263 | + * @param EE_Base_Class $model_obj |
|
| 264 | + * @return void |
|
| 265 | + */ |
|
| 266 | + public function populate_model_obj($model_obj) |
|
| 267 | + { |
|
| 268 | + $model_obj = $this->_model->ensure_is_obj($model_obj); |
|
| 269 | + $this->_model_object = $model_obj; |
|
| 270 | + $defaults = $model_obj->model_field_array(); |
|
| 271 | + foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
| 272 | + $subsection = $this->get_subsection($relation_name, false); |
|
| 273 | + if ($subsection instanceof EE_Form_Input_Base) { |
|
| 274 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 275 | + //then we only expect there to be one |
|
| 276 | + $related_item = $this->_model_object->get_first_related($relation_name); |
|
| 277 | + $defaults[$relation_name] = $related_item->ID(); |
|
| 278 | + } else { |
|
| 279 | + $related_items = $this->_model_object->get_many_related($relation_name); |
|
| 280 | + $ids = array(); |
|
| 281 | + foreach ($related_items as $related_item) { |
|
| 282 | + $ids[] = $related_item->ID(); |
|
| 283 | + } |
|
| 284 | + $defaults[$relation_name] = $ids; |
|
| 285 | + } |
|
| 286 | + } |
|
| 287 | + } |
|
| 288 | + $defaults = apply_filters( |
|
| 289 | + 'FHEE__EE_Model_Form_Section__populate_model_obj', |
|
| 290 | + $defaults, |
|
| 291 | + $this |
|
| 292 | + ); |
|
| 293 | + $this->populate_defaults($defaults); |
|
| 294 | + } |
|
| 295 | + |
|
| 296 | + |
|
| 297 | + |
|
| 298 | + /** |
|
| 299 | + * Gets all the input values that correspond to model fields. Keys are the input/field names, |
|
| 300 | + * values are their normalized values |
|
| 301 | + * |
|
| 302 | + * @return array |
|
| 303 | + */ |
|
| 304 | + public function inputs_values_corresponding_to_model_fields() |
|
| 305 | + { |
|
| 306 | + return array_intersect_key($this->input_values(), $this->_model->field_settings()); |
|
| 307 | + } |
|
| 308 | + |
|
| 309 | + |
|
| 310 | + |
|
| 311 | + /** |
|
| 312 | + * After we've normalized the data as normal, set the corresponding model object |
|
| 313 | + * on the form. |
|
| 314 | + * |
|
| 315 | + * @param array $req_data should usually be $_REQUEST (the default). |
|
| 316 | + * @return void |
|
| 317 | + */ |
|
| 318 | + public function _normalize($req_data) |
|
| 319 | + { |
|
| 320 | + parent::_normalize($req_data); |
|
| 321 | + //create or set the model object, if it isn't already |
|
| 322 | + if (! $this->_model_object) { |
|
| 323 | + //check to see if the form indicates a PK, in which case we want to only retrieve it and update it |
|
| 324 | + $pk_name = $this->_model->primary_key_name(); |
|
| 325 | + $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name)); |
|
| 326 | + if ($model_obj) { |
|
| 327 | + $this->_model_object = $model_obj; |
|
| 328 | + } else { |
|
| 329 | + $this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name()); |
|
| 330 | + } |
|
| 331 | + } |
|
| 332 | + } |
|
| 333 | + |
|
| 334 | + |
|
| 335 | + |
|
| 336 | + /** |
|
| 337 | + * After this form has been initialized and is verified to be valid, |
|
| 338 | + * either creates a model object from its data and saves it, or updates |
|
| 339 | + * the model object its data represents |
|
| 340 | + * |
|
| 341 | + * @throws EE_Error |
|
| 342 | + * @return int, 1 on a successful update, the ID of |
|
| 343 | + * the new entry on insert; 0 on failure |
|
| 344 | + */ |
|
| 345 | + public function save() |
|
| 346 | + { |
|
| 347 | + if (! $this->_model_object) { |
|
| 348 | + throw new EE_Error(sprintf(__("Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically", |
|
| 349 | + "event_espresso"), get_class($this->_model))); |
|
| 350 | + } |
|
| 351 | + //ok so the model object is set. Just set it with the submitted form data |
|
| 352 | + foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) { |
|
| 353 | + //only set the non-primary key |
|
| 354 | + if ($field_name != $this->_model->primary_key_name()) { |
|
| 355 | + $this->_model_object->set($field_name, $field_value); |
|
| 356 | + } |
|
| 357 | + } |
|
| 358 | + $success = $this->_model_object->save(); |
|
| 359 | + foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) { |
|
| 360 | + if (isset($this->_subsections[$relation_name])) { |
|
| 361 | + $success = $this->_save_related_info($relation_name); |
|
| 362 | + } |
|
| 363 | + } |
|
| 364 | + do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success); |
|
| 365 | + return $success; |
|
| 366 | + } |
|
| 367 | + |
|
| 368 | + |
|
| 369 | + |
|
| 370 | + /** |
|
| 371 | + * Automatically finds the related model info from the form, if present, and |
|
| 372 | + * save the relations indicated |
|
| 373 | + * |
|
| 374 | + * @type string $relation_name |
|
| 375 | + * @return bool |
|
| 376 | + * @throws EE_Error |
|
| 377 | + */ |
|
| 378 | + protected function _save_related_info($relation_name) |
|
| 379 | + { |
|
| 380 | + $relation_obj = $this->_model->related_settings_for($relation_name); |
|
| 381 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 382 | + //there is just a foreign key on this model pointing to that one |
|
| 383 | + $this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name); |
|
| 384 | + } elseif ($relation_obj instanceof EE_Has_Many_Relation) { |
|
| 385 | + //then we want to consider all of its currently-related things. |
|
| 386 | + //if they're in this list, keep them |
|
| 387 | + //if they're not in this list, remove them |
|
| 388 | + //and lastly add all the new items |
|
| 389 | + throw new EE_Error(sprintf(__('Automatic saving of related info across a "has many" relation is not yet supported', |
|
| 390 | + "event_espresso"))); |
|
| 391 | + } elseif ($relation_obj instanceof EE_HABTM_Relation) { |
|
| 392 | + //delete everything NOT in this list |
|
| 393 | + $normalized_input_value = $this->get_input_value($relation_name); |
|
| 394 | + if ($normalized_input_value && is_array($normalized_input_value)) { |
|
| 395 | + $where_query_params = array( |
|
| 396 | + $relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value), |
|
| 397 | + ); |
|
| 398 | + } else { |
|
| 399 | + $where_query_params = array(); |
|
| 400 | + } |
|
| 401 | + $this->_model_object->_remove_relations($relation_name, $where_query_params); |
|
| 402 | + foreach ($normalized_input_value as $id) { |
|
| 403 | + $this->_model_object->_add_relation_to($id, $relation_name); |
|
| 404 | + } |
|
| 405 | + } |
|
| 406 | + return true; |
|
| 407 | + } |
|
| 408 | + |
|
| 409 | + |
|
| 410 | + |
|
| 411 | + /** |
|
| 412 | + * Gets the model of this model form |
|
| 413 | + * |
|
| 414 | + * @return EEM_Base |
|
| 415 | + */ |
|
| 416 | + public function get_model() |
|
| 417 | + { |
|
| 418 | + return $this->_model; |
|
| 419 | + } |
|
| 420 | + |
|
| 421 | + |
|
| 422 | + |
|
| 423 | + /** |
|
| 424 | + * Gets the model object for this model form, which was either set |
|
| 425 | + * upon construction (using the $options_array arg 'model_object'), by using |
|
| 426 | + * set_model_object($model_obj), or implicitly |
|
| 427 | + * when receive_form_submission($req_data) was called. |
|
| 428 | + * |
|
| 429 | + * @return EE_Base_Class |
|
| 430 | + */ |
|
| 431 | + public function get_model_object() |
|
| 432 | + { |
|
| 433 | + return $this->_model_object; |
|
| 434 | + } |
|
| 435 | + |
|
| 436 | + |
|
| 437 | + |
|
| 438 | + /** |
|
| 439 | + * gets teh default name of this form section if none is specified |
|
| 440 | + * |
|
| 441 | + * @return string |
|
| 442 | + */ |
|
| 443 | + protected function _set_default_name_if_empty() |
|
| 444 | + { |
|
| 445 | + if (! $this->_name) { |
|
| 446 | + $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form"; |
|
| 447 | + $this->_name = $default_name; |
|
| 448 | + } |
|
| 449 | + } |
|
| 450 | 450 | |
| 451 | 451 | |
| 452 | 452 | |
@@ -249,7 +249,7 @@ discard block |
||
| 249 | 249 | |
| 250 | 250 | /** |
| 251 | 251 | * @access public |
| 252 | - * @return string |
|
| 252 | + * @return boolean |
|
| 253 | 253 | */ |
| 254 | 254 | public static function is_iframe() { |
| 255 | 255 | return \EED_Events_Archive::$iframe; |
@@ -722,7 +722,7 @@ discard block |
||
| 722 | 722 | * display_description |
| 723 | 723 | * |
| 724 | 724 | * @access public |
| 725 | - * @param $value |
|
| 725 | + * @param integer $value |
|
| 726 | 726 | * @return bool |
| 727 | 727 | */ |
| 728 | 728 | public static function display_description( $value ) { |
@@ -37,19 +37,19 @@ discard block |
||
| 37 | 37 | */ |
| 38 | 38 | protected static $using_get_the_excerpt = false; |
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * Used to flag when the event list is being called from an external iframe. |
|
| 42 | - * |
|
| 43 | - * @var bool $iframe |
|
| 44 | - */ |
|
| 45 | - protected static $iframe = false; |
|
| 46 | - |
|
| 47 | - /** |
|
| 40 | + /** |
|
| 41 | + * Used to flag when the event list is being called from an external iframe. |
|
| 42 | + * |
|
| 43 | + * @var bool $iframe |
|
| 44 | + */ |
|
| 45 | + protected static $iframe = false; |
|
| 46 | + |
|
| 47 | + /** |
|
| 48 | 48 | * @var \EventEspresso\core\libraries\iframe_display\EventListIframeEmbedButton $_iframe_embed_button |
| 49 | 49 | */ |
| 50 | 50 | private static $_iframe_embed_button; |
| 51 | 51 | |
| 52 | - /** |
|
| 52 | + /** |
|
| 53 | 53 | * @type EE_Template_Part_Manager $template_parts |
| 54 | 54 | */ |
| 55 | 55 | protected $template_parts; |
@@ -233,36 +233,36 @@ discard block |
||
| 233 | 233 | |
| 234 | 234 | |
| 235 | 235 | |
| 236 | - /** |
|
| 237 | - * @access public |
|
| 238 | - * @return void |
|
| 239 | - * @throws \EE_Error |
|
| 240 | - * @throws \DomainException |
|
| 241 | - */ |
|
| 236 | + /** |
|
| 237 | + * @access public |
|
| 238 | + * @return void |
|
| 239 | + * @throws \EE_Error |
|
| 240 | + * @throws \DomainException |
|
| 241 | + */ |
|
| 242 | 242 | public function event_list_iframe() { |
| 243 | - \EED_Events_Archive::$iframe = true; |
|
| 243 | + \EED_Events_Archive::$iframe = true; |
|
| 244 | 244 | $event_list_iframe = new EventsArchiveIframe( $this ); |
| 245 | 245 | $event_list_iframe->display(); |
| 246 | 246 | } |
| 247 | 247 | |
| 248 | 248 | |
| 249 | 249 | |
| 250 | - /** |
|
| 251 | - * @access public |
|
| 252 | - * @return string |
|
| 253 | - */ |
|
| 250 | + /** |
|
| 251 | + * @access public |
|
| 252 | + * @return string |
|
| 253 | + */ |
|
| 254 | 254 | public static function is_iframe() { |
| 255 | - return \EED_Events_Archive::$iframe; |
|
| 255 | + return \EED_Events_Archive::$iframe; |
|
| 256 | 256 | } |
| 257 | 257 | |
| 258 | 258 | |
| 259 | 259 | |
| 260 | - /** |
|
| 261 | - * @access public |
|
| 262 | - * @return string |
|
| 263 | - */ |
|
| 260 | + /** |
|
| 261 | + * @access public |
|
| 262 | + * @return string |
|
| 263 | + */ |
|
| 264 | 264 | public static function link_target() { |
| 265 | - return \EED_Events_Archive::$iframe ? ' target="_blank"' : ''; |
|
| 265 | + return \EED_Events_Archive::$iframe ? ' target="_blank"' : ''; |
|
| 266 | 266 | } |
| 267 | 267 | |
| 268 | 268 | |
@@ -600,7 +600,7 @@ discard block |
||
| 600 | 600 | * @return void |
| 601 | 601 | */ |
| 602 | 602 | public function load_event_list_assets() { |
| 603 | - do_action( 'AHEE__EED_Events_Archive__before_load_assets' ); |
|
| 603 | + do_action( 'AHEE__EED_Events_Archive__before_load_assets' ); |
|
| 604 | 604 | add_filter( 'FHEE_load_EE_Session', '__return_true' ); |
| 605 | 605 | add_filter( 'FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true' ); |
| 606 | 606 | add_action('wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ), 10 ); |
@@ -3,7 +3,7 @@ discard block |
||
| 3 | 3 | use EventEspresso\core\libraries\iframe_display\EventListIframeEmbedButton; |
| 4 | 4 | use EventEspresso\modules\events_archive\EventsArchiveIframe; |
| 5 | 5 | |
| 6 | -if ( ! defined( 'EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed'); |
|
| 6 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) exit('No direct script access allowed'); |
|
| 7 | 7 | /** |
| 8 | 8 | * Event Espresso |
| 9 | 9 | * |
@@ -60,7 +60,7 @@ discard block |
||
| 60 | 60 | * @return EED_Events_Archive |
| 61 | 61 | */ |
| 62 | 62 | public static function instance() { |
| 63 | - return parent::get_instance( __CLASS__ ); |
|
| 63 | + return parent::get_instance(__CLASS__); |
|
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | |
@@ -72,10 +72,10 @@ discard block |
||
| 72 | 72 | * @return void |
| 73 | 73 | */ |
| 74 | 74 | public static function set_hooks() { |
| 75 | - EE_Config::register_route( EE_Registry::instance()->CFG->core->event_cpt_slug, 'Events_Archive', 'run' ); |
|
| 76 | - EE_Config::register_route( 'event_list', 'Events_Archive', 'event_list' ); |
|
| 77 | - EE_Config::register_route( 'iframe', 'Events_Archive', 'event_list_iframe', 'event_list' ); |
|
| 78 | - add_action( 'wp_loaded', array( 'EED_Events_Archive', 'set_definitions' ), 2 ); |
|
| 75 | + EE_Config::register_route(EE_Registry::instance()->CFG->core->event_cpt_slug, 'Events_Archive', 'run'); |
|
| 76 | + EE_Config::register_route('event_list', 'Events_Archive', 'event_list'); |
|
| 77 | + EE_Config::register_route('iframe', 'Events_Archive', 'event_list_iframe', 'event_list'); |
|
| 78 | + add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2); |
|
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | /** |
@@ -85,12 +85,12 @@ discard block |
||
| 85 | 85 | * @return void |
| 86 | 86 | */ |
| 87 | 87 | public static function set_hooks_admin() { |
| 88 | - add_action( 'wp_loaded', array( 'EED_Events_Archive', 'set_definitions' ), 2 ); |
|
| 88 | + add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2); |
|
| 89 | 89 | // hook into the end of the \EE_Admin_Page::_load_page_dependencies() |
| 90 | 90 | // to load assets for "espresso_events" page on the "default" route (action) |
| 91 | 91 | add_action( |
| 92 | 92 | 'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__default', |
| 93 | - array( 'EED_Events_Archive', 'event_list_iframe_embed_button' ), |
|
| 93 | + array('EED_Events_Archive', 'event_list_iframe_embed_button'), |
|
| 94 | 94 | 10 |
| 95 | 95 | ); |
| 96 | 96 | } |
@@ -105,8 +105,8 @@ discard block |
||
| 105 | 105 | * @return void |
| 106 | 106 | */ |
| 107 | 107 | public static function set_definitions() { |
| 108 | - define( 'EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url( __FILE__ ) . 'assets' . DS ); |
|
| 109 | - define( 'EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace( '\\', DS, plugin_dir_path( __FILE__ )) . 'templates' . DS ); |
|
| 108 | + define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__).'assets'.DS); |
|
| 109 | + define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', DS, plugin_dir_path(__FILE__)).'templates'.DS); |
|
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | |
@@ -114,10 +114,10 @@ discard block |
||
| 114 | 114 | /** |
| 115 | 115 | * set up EE_Events_Archive_Config |
| 116 | 116 | */ |
| 117 | - protected function set_config(){ |
|
| 118 | - $this->set_config_section( 'template_settings' ); |
|
| 119 | - $this->set_config_class( 'EE_Events_Archive_Config' ); |
|
| 120 | - $this->set_config_name( 'EED_Events_Archive' ); |
|
| 117 | + protected function set_config() { |
|
| 118 | + $this->set_config_section('template_settings'); |
|
| 119 | + $this->set_config_class('EE_Events_Archive_Config'); |
|
| 120 | + $this->set_config_name('EED_Events_Archive'); |
|
| 121 | 121 | } |
| 122 | 122 | |
| 123 | 123 | |
@@ -126,7 +126,7 @@ discard block |
||
| 126 | 126 | * @return EventListIframeEmbedButton |
| 127 | 127 | */ |
| 128 | 128 | public static function get_iframe_embed_button() { |
| 129 | - if ( ! self::$_iframe_embed_button instanceof EventListIframeEmbedButton ) { |
|
| 129 | + if ( ! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) { |
|
| 130 | 130 | self::$_iframe_embed_button = new EventListIframeEmbedButton(); |
| 131 | 131 | } |
| 132 | 132 | return self::$_iframe_embed_button; |
@@ -152,35 +152,35 @@ discard block |
||
| 152 | 152 | * @param \EE_Events_Archive_Config $config |
| 153 | 153 | * @return \EE_Template_Part_Manager |
| 154 | 154 | */ |
| 155 | - public function initialize_template_parts( EE_Events_Archive_Config $config = null ) { |
|
| 155 | + public function initialize_template_parts(EE_Events_Archive_Config $config = null) { |
|
| 156 | 156 | $config = $config instanceof EE_Events_Archive_Config ? $config : $this->config(); |
| 157 | 157 | EEH_Autoloader::instance()->register_template_part_autoloaders(); |
| 158 | 158 | $template_parts = new EE_Template_Part_Manager(); |
| 159 | 159 | $template_parts->add_template_part( |
| 160 | 160 | 'tickets', |
| 161 | - __( 'Ticket Selector', 'event_espresso' ), |
|
| 161 | + __('Ticket Selector', 'event_espresso'), |
|
| 162 | 162 | 'content-espresso_events-tickets.php', |
| 163 | 163 | $config->display_order_tickets |
| 164 | 164 | ); |
| 165 | 165 | $template_parts->add_template_part( |
| 166 | 166 | 'datetimes', |
| 167 | - __( 'Dates and Times', 'event_espresso' ), |
|
| 167 | + __('Dates and Times', 'event_espresso'), |
|
| 168 | 168 | 'content-espresso_events-datetimes.php', |
| 169 | 169 | $config->display_order_datetimes |
| 170 | 170 | ); |
| 171 | 171 | $template_parts->add_template_part( |
| 172 | 172 | 'event', |
| 173 | - __( 'Event Description', 'event_espresso' ), |
|
| 173 | + __('Event Description', 'event_espresso'), |
|
| 174 | 174 | 'content-espresso_events-details.php', |
| 175 | 175 | $config->display_order_event |
| 176 | 176 | ); |
| 177 | 177 | $template_parts->add_template_part( |
| 178 | 178 | 'venue', |
| 179 | - __( 'Venue Information', 'event_espresso' ), |
|
| 179 | + __('Venue Information', 'event_espresso'), |
|
| 180 | 180 | 'content-espresso_events-venues.php', |
| 181 | 181 | $config->display_order_venue |
| 182 | 182 | ); |
| 183 | - do_action( 'AHEE__EED_Event_Archive__initialize_template_parts', $template_parts ); |
|
| 183 | + do_action('AHEE__EED_Event_Archive__initialize_template_parts', $template_parts); |
|
| 184 | 184 | return $template_parts; |
| 185 | 185 | } |
| 186 | 186 | |
@@ -193,8 +193,8 @@ discard block |
||
| 193 | 193 | * @param WP $WP |
| 194 | 194 | * @return void |
| 195 | 195 | */ |
| 196 | - public function run( $WP ) { |
|
| 197 | - do_action( 'AHEE__EED_Events_Archive__before_run' ); |
|
| 196 | + public function run($WP) { |
|
| 197 | + do_action('AHEE__EED_Events_Archive__before_run'); |
|
| 198 | 198 | // ensure valid EE_Events_Archive_Config() object exists |
| 199 | 199 | $this->set_config(); |
| 200 | 200 | /** @type EE_Events_Archive_Config $config */ |
@@ -206,14 +206,14 @@ discard block |
||
| 206 | 206 | EEH_Event_Query::add_query_filters(); |
| 207 | 207 | // set params that will get used by the filters |
| 208 | 208 | EEH_Event_Query::set_query_params( |
| 209 | - '', // month |
|
| 210 | - '', // category |
|
| 211 | - $config->display_expired_events, // show_expired |
|
| 212 | - 'start_date', // orderby |
|
| 209 | + '', // month |
|
| 210 | + '', // category |
|
| 211 | + $config->display_expired_events, // show_expired |
|
| 212 | + 'start_date', // orderby |
|
| 213 | 213 | 'ASC' // sort |
| 214 | 214 | ); |
| 215 | 215 | // check what template is loaded |
| 216 | - add_filter( 'template_include', array( $this, 'template_include' ), 999, 1 ); |
|
| 216 | + add_filter('template_include', array($this, 'template_include'), 999, 1); |
|
| 217 | 217 | } |
| 218 | 218 | |
| 219 | 219 | |
@@ -241,7 +241,7 @@ discard block |
||
| 241 | 241 | */ |
| 242 | 242 | public function event_list_iframe() { |
| 243 | 243 | \EED_Events_Archive::$iframe = true; |
| 244 | - $event_list_iframe = new EventsArchiveIframe( $this ); |
|
| 244 | + $event_list_iframe = new EventsArchiveIframe($this); |
|
| 245 | 245 | $event_list_iframe->display(); |
| 246 | 246 | } |
| 247 | 247 | |
@@ -279,32 +279,32 @@ discard block |
||
| 279 | 279 | * @param string $template |
| 280 | 280 | * @return string |
| 281 | 281 | */ |
| 282 | - public function template_include( $template = '' ) { |
|
| 282 | + public function template_include($template = '') { |
|
| 283 | 283 | // don't add content filter for dedicated EE child themes or private posts |
| 284 | - if ( ! EEH_Template::is_espresso_theme() ) { |
|
| 284 | + if ( ! EEH_Template::is_espresso_theme()) { |
|
| 285 | 285 | /** @type EE_Events_Archive_Config $config */ |
| 286 | 286 | $config = $this->config(); |
| 287 | 287 | // add status banner ? |
| 288 | - if ( $config->display_status_banner ) { |
|
| 289 | - add_filter( 'the_title', array( 'EED_Events_Archive', 'the_title' ), 100, 2 ); |
|
| 288 | + if ($config->display_status_banner) { |
|
| 289 | + add_filter('the_title', array('EED_Events_Archive', 'the_title'), 100, 2); |
|
| 290 | 290 | } |
| 291 | 291 | // if NOT a custom template |
| 292 | 292 | if ( |
| 293 | - EE_Registry::instance()->load_core( 'Front_Controller', array(), false, true )->get_selected_template() != 'archive-espresso_events.php' |
|
| 294 | - || apply_filters( 'FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', FALSE ) |
|
| 293 | + EE_Registry::instance()->load_core('Front_Controller', array(), false, true)->get_selected_template() != 'archive-espresso_events.php' |
|
| 294 | + || apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', FALSE) |
|
| 295 | 295 | ) { |
| 296 | 296 | // don't display entry meta because the existing theme will take care of that |
| 297 | - add_filter( 'FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true' ); |
|
| 297 | + add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true'); |
|
| 298 | 298 | // load functions.php file for the theme (loaded by WP if using child theme) |
| 299 | 299 | EEH_Template::load_espresso_theme_functions(); |
| 300 | 300 | // because we don't know if the theme is using the_excerpt() |
| 301 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 301 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 302 | 302 | // or the_content |
| 303 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 303 | + add_filter('the_content', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 304 | 304 | // and just in case they are running get_the_excerpt() which DESTROYS things |
| 305 | - add_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1, 1 ); |
|
| 305 | + add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1); |
|
| 306 | 306 | // don't display entry meta because the existing theme will take care of that |
| 307 | - add_filter( 'FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false' ); |
|
| 307 | + add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false'); |
|
| 308 | 308 | } |
| 309 | 309 | } |
| 310 | 310 | return $template; |
@@ -319,17 +319,17 @@ discard block |
||
| 319 | 319 | * @param string $excerpt |
| 320 | 320 | * @return string |
| 321 | 321 | */ |
| 322 | - public static function get_the_excerpt( $excerpt = '' ) { |
|
| 323 | - if ( post_password_required() ) { |
|
| 322 | + public static function get_the_excerpt($excerpt = '') { |
|
| 323 | + if (post_password_required()) { |
|
| 324 | 324 | return $excerpt; |
| 325 | 325 | } |
| 326 | - if ( apply_filters( 'FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false ) ) { |
|
| 327 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 328 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 329 | - $excerpt = EED_Events_Archive::event_details( $excerpt ); |
|
| 326 | + if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) { |
|
| 327 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100); |
|
| 328 | + remove_filter('the_content', array('EED_Events_Archive', 'event_details'), 100); |
|
| 329 | + $excerpt = EED_Events_Archive::event_details($excerpt); |
|
| 330 | 330 | } else { |
| 331 | 331 | EED_Events_Archive::$using_get_the_excerpt = true; |
| 332 | - add_filter( 'wp_trim_excerpt', array( 'EED_Events_Archive', 'end_get_the_excerpt' ), 999, 1 ); |
|
| 332 | + add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1); |
|
| 333 | 333 | } |
| 334 | 334 | return $excerpt; |
| 335 | 335 | } |
@@ -343,7 +343,7 @@ discard block |
||
| 343 | 343 | * @param string $text |
| 344 | 344 | * @return string |
| 345 | 345 | */ |
| 346 | - public static function end_get_the_excerpt( $text = '' ) { |
|
| 346 | + public static function end_get_the_excerpt($text = '') { |
|
| 347 | 347 | EED_Events_Archive::$using_get_the_excerpt = false; |
| 348 | 348 | return $text; |
| 349 | 349 | } |
@@ -358,10 +358,10 @@ discard block |
||
| 358 | 358 | * @param string $id |
| 359 | 359 | * @return string |
| 360 | 360 | */ |
| 361 | - public static function the_title( $title = '', $id = '' ) { |
|
| 361 | + public static function the_title($title = '', $id = '') { |
|
| 362 | 362 | global $post; |
| 363 | - if ( $post instanceof WP_Post ) { |
|
| 364 | - return in_the_loop() && $post->ID == $id ? espresso_event_status_banner( $post->ID ) . $title : $title; |
|
| 363 | + if ($post instanceof WP_Post) { |
|
| 364 | + return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID).$title : $title; |
|
| 365 | 365 | } |
| 366 | 366 | return $title; |
| 367 | 367 | } |
@@ -375,7 +375,7 @@ discard block |
||
| 375 | 375 | * @param string $content |
| 376 | 376 | * @return string |
| 377 | 377 | */ |
| 378 | - public static function event_details( $content ) { |
|
| 378 | + public static function event_details($content) { |
|
| 379 | 379 | global $post; |
| 380 | 380 | static $current_post_ID = 0; |
| 381 | 381 | if ( |
@@ -384,8 +384,8 @@ discard block |
||
| 384 | 384 | && ! EED_Events_Archive::$using_get_the_excerpt |
| 385 | 385 | && ! post_password_required() |
| 386 | 386 | && ( |
| 387 | - apply_filters( 'FHEE__EES_Espresso_Events__process_shortcode__true', false ) |
|
| 388 | - || ! apply_filters( 'FHEE__content_espresso_events__template_loaded', false ) |
|
| 387 | + apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false) |
|
| 388 | + || ! apply_filters('FHEE__content_espresso_events__template_loaded', false) |
|
| 389 | 389 | ) |
| 390 | 390 | ) { |
| 391 | 391 | // Set current post ID to prevent showing content twice, but only if headers have definitely been sent. |
@@ -394,8 +394,8 @@ discard block |
||
| 394 | 394 | // We want to allow those plugins to still do their thing and have access to our content, but depending on |
| 395 | 395 | // how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice, |
| 396 | 396 | // so the following allows this filter to be applied multiple times, but only once for real |
| 397 | - $current_post_ID = did_action( 'loop_start' ) ? $post->ID : 0; |
|
| 398 | - if ( EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order ) { |
|
| 397 | + $current_post_ID = did_action('loop_start') ? $post->ID : 0; |
|
| 398 | + if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) { |
|
| 399 | 399 | $content = \EED_Events_Archive::use_sortable_display_order(); |
| 400 | 400 | } else { |
| 401 | 401 | $content = \EED_Events_Archive::use_filterable_display_order(); |
@@ -414,20 +414,20 @@ discard block |
||
| 414 | 414 | */ |
| 415 | 415 | protected static function use_sortable_display_order() { |
| 416 | 416 | // no further password checks required atm |
| 417 | - add_filter( 'FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true' ); |
|
| 417 | + add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true'); |
|
| 418 | 418 | // we need to first remove this callback from being applied to the_content() or the_excerpt() (otherwise it will recurse and blow up the interweb) |
| 419 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 420 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 421 | - remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 ); |
|
| 419 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100); |
|
| 420 | + remove_filter('the_content', array('EED_Events_Archive', 'event_details'), 100); |
|
| 421 | + remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1); |
|
| 422 | 422 | // now add additional content depending on whether event is using the_excerpt() or the_content() |
| 423 | 423 | EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts(); |
| 424 | - $content = EEH_Template::locate_template( 'content-espresso_events-details.php' ); |
|
| 425 | - $content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters( $content ); |
|
| 424 | + $content = EEH_Template::locate_template('content-espresso_events-details.php'); |
|
| 425 | + $content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content); |
|
| 426 | 426 | // re-add our main filters (or else the next event won't have them) |
| 427 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 428 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 429 | - add_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1, 1 ); |
|
| 430 | - remove_filter( 'FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true' ); |
|
| 427 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 428 | + add_filter('the_content', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 429 | + add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1); |
|
| 430 | + remove_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true'); |
|
| 431 | 431 | return $content; |
| 432 | 432 | } |
| 433 | 433 | |
@@ -442,22 +442,22 @@ discard block |
||
| 442 | 442 | protected static function use_filterable_display_order() { |
| 443 | 443 | // we need to first remove this callback from being applied to the_content() |
| 444 | 444 | // (otherwise it will recurse and blow up the interweb) |
| 445 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 446 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 447 | - remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 ); |
|
| 445 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100); |
|
| 446 | + remove_filter('the_content', array('EED_Events_Archive', 'event_details'), 100); |
|
| 447 | + remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1); |
|
| 448 | 448 | //now add additional content depending on whether event is using the_excerpt() or the_content() |
| 449 | 449 | EED_Events_Archive::_add_additional_excerpt_filters(); |
| 450 | 450 | EED_Events_Archive::_add_additional_content_filters(); |
| 451 | - do_action( 'AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters' ); |
|
| 451 | + do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters'); |
|
| 452 | 452 | // now load our template |
| 453 | - $content = EEH_Template::locate_template( 'content-espresso_events-details.php' ); |
|
| 453 | + $content = EEH_Template::locate_template('content-espresso_events-details.php'); |
|
| 454 | 454 | // re-add our main filters (or else the next event won't have them) |
| 455 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 456 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100, 1 ); |
|
| 457 | - add_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1, 1 ); |
|
| 455 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 456 | + add_filter('the_content', array('EED_Events_Archive', 'event_details'), 100, 1); |
|
| 457 | + add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1); |
|
| 458 | 458 | // but remove the other filters so that they don't get applied to the next post |
| 459 | 459 | EED_Events_Archive::_remove_additional_events_archive_filters(); |
| 460 | - do_action( 'AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters' ); |
|
| 460 | + do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters'); |
|
| 461 | 461 | // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt) |
| 462 | 462 | //return ! empty( $template ) ? $template : $content; |
| 463 | 463 | return $content; |
@@ -472,11 +472,11 @@ discard block |
||
| 472 | 472 | * @param string $content |
| 473 | 473 | * @return string |
| 474 | 474 | */ |
| 475 | - public static function event_datetimes( $content ) { |
|
| 476 | - if ( post_password_required() ) { |
|
| 475 | + public static function event_datetimes($content) { |
|
| 476 | + if (post_password_required()) { |
|
| 477 | 477 | return $content; |
| 478 | 478 | } |
| 479 | - return EEH_Template::locate_template( 'content-espresso_events-datetimes.php' ) . $content; |
|
| 479 | + return EEH_Template::locate_template('content-espresso_events-datetimes.php').$content; |
|
| 480 | 480 | } |
| 481 | 481 | |
| 482 | 482 | /** |
@@ -486,11 +486,11 @@ discard block |
||
| 486 | 486 | * @param string $content |
| 487 | 487 | * @return string |
| 488 | 488 | */ |
| 489 | - public static function event_tickets( $content ) { |
|
| 490 | - if ( post_password_required() ) { |
|
| 489 | + public static function event_tickets($content) { |
|
| 490 | + if (post_password_required()) { |
|
| 491 | 491 | return $content; |
| 492 | 492 | } |
| 493 | - return EEH_Template::locate_template( 'content-espresso_events-tickets.php' ) . $content; |
|
| 493 | + return EEH_Template::locate_template('content-espresso_events-tickets.php').$content; |
|
| 494 | 494 | } |
| 495 | 495 | |
| 496 | 496 | |
@@ -502,8 +502,8 @@ discard block |
||
| 502 | 502 | * @param string $content |
| 503 | 503 | * @return string |
| 504 | 504 | */ |
| 505 | - public static function event_venue( $content ) { |
|
| 506 | - return EED_Events_Archive::event_venues( $content ); |
|
| 505 | + public static function event_venue($content) { |
|
| 506 | + return EED_Events_Archive::event_venues($content); |
|
| 507 | 507 | } |
| 508 | 508 | |
| 509 | 509 | /** |
@@ -513,11 +513,11 @@ discard block |
||
| 513 | 513 | * @param string $content |
| 514 | 514 | * @return string |
| 515 | 515 | */ |
| 516 | - public static function event_venues( $content ) { |
|
| 517 | - if ( post_password_required() ) { |
|
| 516 | + public static function event_venues($content) { |
|
| 517 | + if (post_password_required()) { |
|
| 518 | 518 | return $content; |
| 519 | 519 | } |
| 520 | - return $content . EEH_Template::locate_template( 'content-espresso_events-venues.php' ); |
|
| 520 | + return $content.EEH_Template::locate_template('content-espresso_events-venues.php'); |
|
| 521 | 521 | } |
| 522 | 522 | |
| 523 | 523 | |
@@ -529,9 +529,9 @@ discard block |
||
| 529 | 529 | * @return void |
| 530 | 530 | */ |
| 531 | 531 | private static function _add_additional_excerpt_filters() { |
| 532 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_datetimes' ), 110, 1 ); |
|
| 533 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_tickets' ), 120, 1 ); |
|
| 534 | - add_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_venues' ), 130, 1 ); |
|
| 532 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_datetimes'), 110, 1); |
|
| 533 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_tickets'), 120, 1); |
|
| 534 | + add_filter('the_excerpt', array('EED_Events_Archive', 'event_venues'), 130, 1); |
|
| 535 | 535 | } |
| 536 | 536 | |
| 537 | 537 | |
@@ -543,9 +543,9 @@ discard block |
||
| 543 | 543 | * @return void |
| 544 | 544 | */ |
| 545 | 545 | private static function _add_additional_content_filters() { |
| 546 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_datetimes' ), 110, 1 ); |
|
| 547 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_tickets' ), 120, 1 ); |
|
| 548 | - add_filter( 'the_content', array( 'EED_Events_Archive', 'event_venues' ), 130, 1 ); |
|
| 546 | + add_filter('the_content', array('EED_Events_Archive', 'event_datetimes'), 110, 1); |
|
| 547 | + add_filter('the_content', array('EED_Events_Archive', 'event_tickets'), 120, 1); |
|
| 548 | + add_filter('the_content', array('EED_Events_Archive', 'event_venues'), 130, 1); |
|
| 549 | 549 | } |
| 550 | 550 | |
| 551 | 551 | |
@@ -557,12 +557,12 @@ discard block |
||
| 557 | 557 | * @return void |
| 558 | 558 | */ |
| 559 | 559 | private static function _remove_additional_events_archive_filters() { |
| 560 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_datetimes' ), 110 ); |
|
| 561 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_tickets' ), 120 ); |
|
| 562 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_venues' ), 130 ); |
|
| 563 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_datetimes' ), 110 ); |
|
| 564 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_tickets' ), 120 ); |
|
| 565 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_venues' ), 130 ); |
|
| 560 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_datetimes'), 110); |
|
| 561 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_tickets'), 120); |
|
| 562 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_venues'), 130); |
|
| 563 | + remove_filter('the_content', array('EED_Events_Archive', 'event_datetimes'), 110); |
|
| 564 | + remove_filter('the_content', array('EED_Events_Archive', 'event_tickets'), 120); |
|
| 565 | + remove_filter('the_content', array('EED_Events_Archive', 'event_venues'), 130); |
|
| 566 | 566 | } |
| 567 | 567 | |
| 568 | 568 | |
@@ -575,17 +575,17 @@ discard block |
||
| 575 | 575 | */ |
| 576 | 576 | public static function remove_all_events_archive_filters() { |
| 577 | 577 | //remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 ); |
| 578 | - remove_filter( 'the_title', array( 'EED_Events_Archive', 'the_title' ), 100 ); |
|
| 579 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 580 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_datetimes' ), 110 ); |
|
| 581 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_tickets' ), 120 ); |
|
| 582 | - remove_filter( 'the_excerpt', array( 'EED_Events_Archive', 'event_venues' ), 130 ); |
|
| 583 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_details' ), 100 ); |
|
| 584 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_datetimes' ), 110 ); |
|
| 585 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_tickets' ), 120 ); |
|
| 586 | - remove_filter( 'the_content', array( 'EED_Events_Archive', 'event_venues' ), 130 ); |
|
| 578 | + remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 100); |
|
| 579 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_details'), 100); |
|
| 580 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_datetimes'), 110); |
|
| 581 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_tickets'), 120); |
|
| 582 | + remove_filter('the_excerpt', array('EED_Events_Archive', 'event_venues'), 130); |
|
| 583 | + remove_filter('the_content', array('EED_Events_Archive', 'event_details'), 100); |
|
| 584 | + remove_filter('the_content', array('EED_Events_Archive', 'event_datetimes'), 110); |
|
| 585 | + remove_filter('the_content', array('EED_Events_Archive', 'event_tickets'), 120); |
|
| 586 | + remove_filter('the_content', array('EED_Events_Archive', 'event_venues'), 130); |
|
| 587 | 587 | // don't display entry meta because the existing theme will take care of that |
| 588 | - remove_filter( 'FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false' ); |
|
| 588 | + remove_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false'); |
|
| 589 | 589 | } |
| 590 | 590 | |
| 591 | 591 | |
@@ -600,12 +600,12 @@ discard block |
||
| 600 | 600 | * @return void |
| 601 | 601 | */ |
| 602 | 602 | public function load_event_list_assets() { |
| 603 | - do_action( 'AHEE__EED_Events_Archive__before_load_assets' ); |
|
| 604 | - add_filter( 'FHEE_load_EE_Session', '__return_true' ); |
|
| 605 | - add_filter( 'FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true' ); |
|
| 606 | - add_action('wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ), 10 ); |
|
| 607 | - if ( EE_Registry::instance()->CFG->map_settings->use_google_maps ) { |
|
| 608 | - add_action('wp_enqueue_scripts', array( 'EEH_Maps', 'espresso_google_map_js' ), 11 ); |
|
| 603 | + do_action('AHEE__EED_Events_Archive__before_load_assets'); |
|
| 604 | + add_filter('FHEE_load_EE_Session', '__return_true'); |
|
| 605 | + add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true'); |
|
| 606 | + add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10); |
|
| 607 | + if (EE_Registry::instance()->CFG->map_settings->use_google_maps) { |
|
| 608 | + add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11); |
|
| 609 | 609 | } |
| 610 | 610 | } |
| 611 | 611 | |
@@ -622,13 +622,13 @@ discard block |
||
| 622 | 622 | */ |
| 623 | 623 | public function wp_enqueue_scripts() { |
| 624 | 624 | // get some style |
| 625 | - if ( apply_filters( 'FHEE_enable_default_espresso_css', FALSE ) ) { |
|
| 625 | + if (apply_filters('FHEE_enable_default_espresso_css', FALSE)) { |
|
| 626 | 626 | // first check uploads folder |
| 627 | - if ( EEH_File::is_readable( get_stylesheet_directory() . $this->theme . DS . 'style.css' )) { |
|
| 628 | - wp_register_style( $this->theme, get_stylesheet_directory_uri() . $this->theme . DS . 'style.css', array( 'dashicons', 'espresso_default' )); |
|
| 627 | + if (EEH_File::is_readable(get_stylesheet_directory().$this->theme.DS.'style.css')) { |
|
| 628 | + wp_register_style($this->theme, get_stylesheet_directory_uri().$this->theme.DS.'style.css', array('dashicons', 'espresso_default')); |
|
| 629 | 629 | } else { |
| 630 | 630 | } |
| 631 | - wp_enqueue_style( $this->theme ); |
|
| 631 | + wp_enqueue_style($this->theme); |
|
| 632 | 632 | |
| 633 | 633 | } |
| 634 | 634 | } |
@@ -646,8 +646,8 @@ discard block |
||
| 646 | 646 | */ |
| 647 | 647 | public static function template_settings_form() { |
| 648 | 648 | $template_settings = EE_Registry::instance()->CFG->template_settings; |
| 649 | - $template_settings->EED_Events_Archive = isset( $template_settings->EED_Events_Archive ) ? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config(); |
|
| 650 | - $template_settings->EED_Events_Archive = apply_filters( 'FHEE__EED_Events_Archive__template_settings_form__event_list_config', $template_settings->EED_Events_Archive ); |
|
| 649 | + $template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive) ? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config(); |
|
| 650 | + $template_settings->EED_Events_Archive = apply_filters('FHEE__EED_Events_Archive__template_settings_form__event_list_config', $template_settings->EED_Events_Archive); |
|
| 651 | 651 | $events_archive_settings = array( |
| 652 | 652 | 'display_status_banner' => 0, |
| 653 | 653 | 'display_description' => 1, |
@@ -656,8 +656,8 @@ discard block |
||
| 656 | 656 | 'display_venue' => 0, |
| 657 | 657 | 'display_expired_events' => 0 |
| 658 | 658 | ); |
| 659 | - $events_archive_settings = array_merge( $events_archive_settings, (array)$template_settings->EED_Events_Archive ); |
|
| 660 | - EEH_Template::display_template( EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php', $events_archive_settings ); |
|
| 659 | + $events_archive_settings = array_merge($events_archive_settings, (array) $template_settings->EED_Events_Archive); |
|
| 660 | + EEH_Template::display_template(EVENTS_ARCHIVE_TEMPLATES_PATH.'admin-event-list-settings.template.php', $events_archive_settings); |
|
| 661 | 661 | } |
| 662 | 662 | |
| 663 | 663 | |
@@ -673,16 +673,16 @@ discard block |
||
| 673 | 673 | * @param EE_Request_Handler $REQ |
| 674 | 674 | * @return EE_Template_Config |
| 675 | 675 | */ |
| 676 | - public static function update_template_settings( $CFG, $REQ ) { |
|
| 676 | + public static function update_template_settings($CFG, $REQ) { |
|
| 677 | 677 | $CFG->EED_Events_Archive = new EE_Events_Archive_Config(); |
| 678 | 678 | // unless we are resetting the config... |
| 679 | - if ( ! isset( $REQ['EED_Events_Archive_reset_event_list_settings'] ) || absint( $REQ['EED_Events_Archive_reset_event_list_settings'] ) !== 1 ) { |
|
| 680 | - $CFG->EED_Events_Archive->display_status_banner = isset( $REQ['EED_Events_Archive_display_status_banner'] ) ? absint( $REQ['EED_Events_Archive_display_status_banner'] ) : 0; |
|
| 681 | - $CFG->EED_Events_Archive->display_description = isset( $REQ['EED_Events_Archive_display_description'] ) ? absint( $REQ['EED_Events_Archive_display_description'] ) : 1; |
|
| 682 | - $CFG->EED_Events_Archive->display_ticket_selector = isset( $REQ['EED_Events_Archive_display_ticket_selector'] ) ? absint( $REQ['EED_Events_Archive_display_ticket_selector'] ) : 0; |
|
| 683 | - $CFG->EED_Events_Archive->display_datetimes = isset( $REQ['EED_Events_Archive_display_datetimes'] ) ? absint( $REQ['EED_Events_Archive_display_datetimes'] ) : 1; |
|
| 684 | - $CFG->EED_Events_Archive->display_venue = isset( $REQ['EED_Events_Archive_display_venue'] ) ? absint( $REQ['EED_Events_Archive_display_venue'] ) : 0; |
|
| 685 | - $CFG->EED_Events_Archive->display_expired_events = isset( $REQ['EED_Events_Archive_display_expired_events'] ) ? absint( $REQ['EED_Events_Archive_display_expired_events'] ) : 0; } |
|
| 679 | + if ( ! isset($REQ['EED_Events_Archive_reset_event_list_settings']) || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1) { |
|
| 680 | + $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner']) ? absint($REQ['EED_Events_Archive_display_status_banner']) : 0; |
|
| 681 | + $CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description']) ? absint($REQ['EED_Events_Archive_display_description']) : 1; |
|
| 682 | + $CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector']) ? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0; |
|
| 683 | + $CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint($REQ['EED_Events_Archive_display_datetimes']) : 1; |
|
| 684 | + $CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint($REQ['EED_Events_Archive_display_venue']) : 0; |
|
| 685 | + $CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events']) ? absint($REQ['EED_Events_Archive_display_expired_events']) : 0; } |
|
| 686 | 686 | return $CFG; |
| 687 | 687 | } |
| 688 | 688 | |
@@ -695,10 +695,10 @@ discard block |
||
| 695 | 695 | * @param string $extra_class |
| 696 | 696 | * @return string |
| 697 | 697 | */ |
| 698 | - public static function event_list_css( $extra_class = '' ) { |
|
| 699 | - $event_list_css = ! empty( $extra_class ) ? array( $extra_class ) : array(); |
|
| 698 | + public static function event_list_css($extra_class = '') { |
|
| 699 | + $event_list_css = ! empty($extra_class) ? array($extra_class) : array(); |
|
| 700 | 700 | $event_list_css[] = 'espresso-event-list-event'; |
| 701 | - return implode( ' ', $event_list_css ); |
|
| 701 | + return implode(' ', $event_list_css); |
|
| 702 | 702 | } |
| 703 | 703 | |
| 704 | 704 | |
@@ -725,9 +725,9 @@ discard block |
||
| 725 | 725 | * @param $value |
| 726 | 726 | * @return bool |
| 727 | 727 | */ |
| 728 | - public static function display_description( $value ) { |
|
| 728 | + public static function display_description($value) { |
|
| 729 | 729 | $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive; |
| 730 | - $display_description= isset( $config->display_description ) ? $config->display_description : 1; |
|
| 730 | + $display_description = isset($config->display_description) ? $config->display_description : 1; |
|
| 731 | 731 | return $display_description === $value ? TRUE : FALSE; |
| 732 | 732 | } |
| 733 | 733 | |
@@ -740,7 +740,7 @@ discard block |
||
| 740 | 740 | */ |
| 741 | 741 | public static function display_ticket_selector() { |
| 742 | 742 | $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive; |
| 743 | - return isset( $config->display_ticket_selector ) && $config->display_ticket_selector ? TRUE : FALSE; |
|
| 743 | + return isset($config->display_ticket_selector) && $config->display_ticket_selector ? TRUE : FALSE; |
|
| 744 | 744 | } |
| 745 | 745 | |
| 746 | 746 | |
@@ -753,7 +753,7 @@ discard block |
||
| 753 | 753 | */ |
| 754 | 754 | public static function display_venue() { |
| 755 | 755 | $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive; |
| 756 | - return isset( $config->display_venue ) && $config->display_venue && EEH_Venue_View::venue_name() ? TRUE : FALSE; |
|
| 756 | + return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? TRUE : FALSE; |
|
| 757 | 757 | } |
| 758 | 758 | |
| 759 | 759 | |
@@ -765,7 +765,7 @@ discard block |
||
| 765 | 765 | */ |
| 766 | 766 | public static function display_datetimes() { |
| 767 | 767 | $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive; |
| 768 | - return isset( $config->display_datetimes ) && $config->display_datetimes ? TRUE : FALSE; |
|
| 768 | + return isset($config->display_datetimes) && $config->display_datetimes ? TRUE : FALSE; |
|
| 769 | 769 | } |
| 770 | 770 | |
| 771 | 771 | |
@@ -780,7 +780,7 @@ discard block |
||
| 780 | 780 | * @return string |
| 781 | 781 | */ |
| 782 | 782 | public static function event_list_title() { |
| 783 | - return apply_filters( 'FHEE__archive_espresso_events_template__upcoming_events_h1', __( 'Upcoming Events', 'event_espresso' )); |
|
| 783 | + return apply_filters('FHEE__archive_espresso_events_template__upcoming_events_h1', __('Upcoming Events', 'event_espresso')); |
|
| 784 | 784 | } |
| 785 | 785 | |
| 786 | 786 | |
@@ -789,11 +789,11 @@ discard block |
||
| 789 | 789 | /** |
| 790 | 790 | * @since 4.4.0 |
| 791 | 791 | */ |
| 792 | - public static function _doing_it_wrong_notice( $function = '' ) { |
|
| 792 | + public static function _doing_it_wrong_notice($function = '') { |
|
| 793 | 793 | EE_Error::doing_it_wrong( |
| 794 | 794 | __FUNCTION__, |
| 795 | 795 | sprintf( |
| 796 | - __( 'EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s', 'event_espresso' ), |
|
| 796 | + __('EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s', 'event_espresso'), |
|
| 797 | 797 | $function, |
| 798 | 798 | '<br />', |
| 799 | 799 | '4.6.0' |
@@ -815,89 +815,89 @@ discard block |
||
| 815 | 815 | * @deprecated |
| 816 | 816 | * @since 4.4.0 |
| 817 | 817 | */ |
| 818 | - public function posts_fields( $SQL, WP_Query $wp_query ) { |
|
| 819 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 820 | - return EEH_Event_Query::posts_fields( $SQL, $wp_query ); |
|
| 818 | + public function posts_fields($SQL, WP_Query $wp_query) { |
|
| 819 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 820 | + return EEH_Event_Query::posts_fields($SQL, $wp_query); |
|
| 821 | 821 | } |
| 822 | 822 | /** |
| 823 | 823 | * @deprecated |
| 824 | 824 | * @since 4.4.0 |
| 825 | 825 | */ |
| 826 | - public static function posts_fields_sql_for_orderby( $orderby_params = array() ) { |
|
| 827 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 828 | - return EEH_Event_Query::posts_fields_sql_for_orderby( $orderby_params ); |
|
| 826 | + public static function posts_fields_sql_for_orderby($orderby_params = array()) { |
|
| 827 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 828 | + return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params); |
|
| 829 | 829 | } |
| 830 | 830 | /** |
| 831 | 831 | * @deprecated |
| 832 | 832 | * @since 4.4.0 |
| 833 | 833 | */ |
| 834 | - public function posts_join( $SQL, WP_Query $wp_query ) { |
|
| 835 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 836 | - return EEH_Event_Query::posts_join( $SQL, $wp_query ); |
|
| 834 | + public function posts_join($SQL, WP_Query $wp_query) { |
|
| 835 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 836 | + return EEH_Event_Query::posts_join($SQL, $wp_query); |
|
| 837 | 837 | } |
| 838 | 838 | /** |
| 839 | 839 | * @deprecated |
| 840 | 840 | * @since 4.4.0 |
| 841 | 841 | */ |
| 842 | - public static function posts_join_sql_for_terms( $join_terms = NULL ) { |
|
| 843 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 844 | - return EEH_Event_Query::posts_join_sql_for_terms( $join_terms ); |
|
| 842 | + public static function posts_join_sql_for_terms($join_terms = NULL) { |
|
| 843 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 844 | + return EEH_Event_Query::posts_join_sql_for_terms($join_terms); |
|
| 845 | 845 | } |
| 846 | 846 | /** |
| 847 | 847 | * @deprecated |
| 848 | 848 | * @since 4.4.0 |
| 849 | 849 | */ |
| 850 | - public static function posts_join_for_orderby( $orderby_params = array() ) { |
|
| 851 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 852 | - return EEH_Event_Query::posts_join_for_orderby( $orderby_params ); |
|
| 850 | + public static function posts_join_for_orderby($orderby_params = array()) { |
|
| 851 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 852 | + return EEH_Event_Query::posts_join_for_orderby($orderby_params); |
|
| 853 | 853 | } |
| 854 | 854 | /** |
| 855 | 855 | * @deprecated |
| 856 | 856 | * @since 4.4.0 |
| 857 | 857 | */ |
| 858 | - public function posts_where( $SQL, WP_Query $wp_query ) { |
|
| 859 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 860 | - return EEH_Event_Query::posts_where( $SQL, $wp_query ); |
|
| 858 | + public function posts_where($SQL, WP_Query $wp_query) { |
|
| 859 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 860 | + return EEH_Event_Query::posts_where($SQL, $wp_query); |
|
| 861 | 861 | } |
| 862 | 862 | /** |
| 863 | 863 | * @deprecated |
| 864 | 864 | * @since 4.4.0 |
| 865 | 865 | */ |
| 866 | - public static function posts_where_sql_for_show_expired( $show_expired = FALSE ) { |
|
| 867 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 868 | - return EEH_Event_Query::posts_where_sql_for_show_expired( $show_expired ); |
|
| 866 | + public static function posts_where_sql_for_show_expired($show_expired = FALSE) { |
|
| 867 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 868 | + return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired); |
|
| 869 | 869 | } |
| 870 | 870 | /** |
| 871 | 871 | * @deprecated |
| 872 | 872 | * @since 4.4.0 |
| 873 | 873 | */ |
| 874 | - public static function posts_where_sql_for_event_category_slug( $event_category_slug = NULL ) { |
|
| 875 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 876 | - return EEH_Event_Query::posts_where_sql_for_event_category_slug( $event_category_slug ); |
|
| 874 | + public static function posts_where_sql_for_event_category_slug($event_category_slug = NULL) { |
|
| 875 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 876 | + return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug); |
|
| 877 | 877 | } |
| 878 | 878 | /** |
| 879 | 879 | * @deprecated |
| 880 | 880 | * @since 4.4.0 |
| 881 | 881 | */ |
| 882 | - public static function posts_where_sql_for_event_list_month( $month = NULL ) { |
|
| 883 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 884 | - return EEH_Event_Query::posts_where_sql_for_event_list_month( $month ); |
|
| 882 | + public static function posts_where_sql_for_event_list_month($month = NULL) { |
|
| 883 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 884 | + return EEH_Event_Query::posts_where_sql_for_event_list_month($month); |
|
| 885 | 885 | } |
| 886 | 886 | /** |
| 887 | 887 | * @deprecated |
| 888 | 888 | * @since 4.4.0 |
| 889 | 889 | */ |
| 890 | - public function posts_orderby( $SQL, WP_Query $wp_query ) { |
|
| 891 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 892 | - return EEH_Event_Query::posts_orderby( $SQL, $wp_query ); |
|
| 890 | + public function posts_orderby($SQL, WP_Query $wp_query) { |
|
| 891 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 892 | + return EEH_Event_Query::posts_orderby($SQL, $wp_query); |
|
| 893 | 893 | } |
| 894 | 894 | /** |
| 895 | 895 | * @deprecated |
| 896 | 896 | * @since 4.4.0 |
| 897 | 897 | */ |
| 898 | - public static function posts_orderby_sql( $orderby_params = array(), $sort = 'ASC' ) { |
|
| 899 | - EED_Events_Archive::_doing_it_wrong_notice( __FUNCTION__ ); |
|
| 900 | - return EEH_Event_Query::posts_orderby_sql( $orderby_params, $sort ); |
|
| 898 | + public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC') { |
|
| 899 | + EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__); |
|
| 900 | + return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort); |
|
| 901 | 901 | } |
| 902 | 902 | |
| 903 | 903 | |
@@ -928,8 +928,8 @@ discard block |
||
| 928 | 928 | * @param string $extra_class |
| 929 | 929 | * @return string |
| 930 | 930 | */ |
| 931 | -function espresso_event_list_css( $extra_class = '' ) { |
|
| 932 | - return EED_Events_Archive::event_list_css( $extra_class ); |
|
| 931 | +function espresso_event_list_css($extra_class = '') { |
|
| 932 | + return EED_Events_Archive::event_list_css($extra_class); |
|
| 933 | 933 | } |
| 934 | 934 | |
| 935 | 935 | /** |
@@ -943,14 +943,14 @@ discard block |
||
| 943 | 943 | * @return bool |
| 944 | 944 | */ |
| 945 | 945 | function espresso_display_full_description_in_event_list() { |
| 946 | - return EED_Events_Archive::display_description( 2 ); |
|
| 946 | + return EED_Events_Archive::display_description(2); |
|
| 947 | 947 | } |
| 948 | 948 | |
| 949 | 949 | /** |
| 950 | 950 | * @return bool |
| 951 | 951 | */ |
| 952 | 952 | function espresso_display_excerpt_in_event_list() { |
| 953 | - return EED_Events_Archive::display_description( 1 ); |
|
| 953 | + return EED_Events_Archive::display_description(1); |
|
| 954 | 954 | } |
| 955 | 955 | |
| 956 | 956 | /** |
@@ -2,7 +2,7 @@ discard block |
||
| 2 | 2 | namespace EventEspresso\modules\ticket_selector; |
| 3 | 3 | |
| 4 | 4 | if ( ! defined( 'EVENT_ESPRESSO_VERSION' ) ) { |
| 5 | - exit( 'No direct script access allowed' ); |
|
| 5 | + exit( 'No direct script access allowed' ); |
|
| 6 | 6 | } |
| 7 | 7 | |
| 8 | 8 | |
@@ -19,678 +19,678 @@ discard block |
||
| 19 | 19 | class DisplayTicketSelector |
| 20 | 20 | { |
| 21 | 21 | |
| 22 | - /** |
|
| 23 | - * event that ticket selector is being generated for |
|
| 24 | - * |
|
| 25 | - * @access protected |
|
| 26 | - * @var \EE_Event $event |
|
| 27 | - */ |
|
| 28 | - protected $event; |
|
| 29 | - |
|
| 30 | - /** |
|
| 31 | - * Used to flag when the ticket selector is being called from an external iframe. |
|
| 32 | - * |
|
| 33 | - * @var bool $iframe |
|
| 34 | - */ |
|
| 35 | - protected $iframe = false; |
|
| 36 | - |
|
| 37 | - /** |
|
| 38 | - * max attendees that can register for event at one time |
|
| 39 | - * |
|
| 40 | - * @var int $max_attendees |
|
| 41 | - */ |
|
| 42 | - private $max_attendees = EE_INF; |
|
| 43 | - |
|
| 44 | - /** |
|
| 45 | - *@var string $date_format |
|
| 46 | - */ |
|
| 47 | - private $date_format = ''; |
|
| 48 | - |
|
| 49 | - /** |
|
| 50 | - *@var string $time_format |
|
| 51 | - */ |
|
| 52 | - private $time_format = ''; |
|
| 53 | - |
|
| 54 | - |
|
| 55 | - |
|
| 56 | - /** |
|
| 57 | - * DisplayTicketSelector constructor. |
|
| 58 | - */ |
|
| 59 | - public function __construct() |
|
| 60 | - { |
|
| 61 | - $this->date_format = apply_filters( |
|
| 62 | - 'FHEE__EED_Ticket_Selector__display_ticket_selector__date_format', |
|
| 63 | - get_option('date_format') |
|
| 64 | - ); |
|
| 65 | - $this->time_format = apply_filters( |
|
| 66 | - 'FHEE__EED_Ticket_Selector__display_ticket_selector__time_format', |
|
| 67 | - get_option('time_format') |
|
| 68 | - ); |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - |
|
| 72 | - |
|
| 73 | - /** |
|
| 74 | - * @param boolean $iframe |
|
| 75 | - */ |
|
| 76 | - public function setIframe( $iframe = true ) |
|
| 77 | - { |
|
| 78 | - $this->iframe = filter_var( $iframe, FILTER_VALIDATE_BOOLEAN ); |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - |
|
| 82 | - |
|
| 83 | - /** |
|
| 84 | - * finds and sets the \EE_Event object for use throughout class |
|
| 85 | - * |
|
| 86 | - * @param mixed $event |
|
| 87 | - * @return bool |
|
| 88 | - */ |
|
| 89 | - protected function setEvent( $event = null ) |
|
| 90 | - { |
|
| 91 | - if ( $event === null ) { |
|
| 92 | - global $post; |
|
| 93 | - $event = $post; |
|
| 94 | - } |
|
| 95 | - if ( $event instanceof \EE_Event ) { |
|
| 96 | - $this->event = $event; |
|
| 97 | - } else if ( $event instanceof \WP_Post ) { |
|
| 98 | - if ( isset( $event->EE_Event ) && $event->EE_Event instanceof \EE_Event ) { |
|
| 99 | - $this->event = $event->EE_Event; |
|
| 100 | - } else if ( $event->post_type === 'espresso_events' ) { |
|
| 101 | - $event->EE_Event = \EEM_Event::instance()->instantiate_class_from_post_object( $event ); |
|
| 102 | - $this->event = $event->EE_Event; |
|
| 103 | - } |
|
| 104 | - } else { |
|
| 105 | - $user_msg = __( 'No Event object or an invalid Event object was supplied.', 'event_espresso' ); |
|
| 106 | - $dev_msg = $user_msg . __( |
|
| 107 | - 'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.', |
|
| 108 | - 'event_espresso' |
|
| 109 | - ); |
|
| 110 | - \EE_Error::add_error( $user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__ ); |
|
| 111 | - return false; |
|
| 112 | - } |
|
| 113 | - return true; |
|
| 114 | - } |
|
| 115 | - |
|
| 116 | - |
|
| 117 | - |
|
| 118 | - /** |
|
| 119 | - * @return int |
|
| 120 | - */ |
|
| 121 | - public function getMaxAttendees() |
|
| 122 | - { |
|
| 123 | - return $this->max_attendees; |
|
| 124 | - } |
|
| 125 | - |
|
| 126 | - |
|
| 127 | - |
|
| 128 | - /** |
|
| 129 | - * @param int $max_attendees |
|
| 130 | - */ |
|
| 131 | - public function setMaxAttendees($max_attendees) |
|
| 132 | - { |
|
| 133 | - $this->max_attendees = absint( |
|
| 134 | - apply_filters( |
|
| 135 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector__max_tickets', |
|
| 136 | - $max_attendees |
|
| 137 | - ) |
|
| 138 | - ); |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - |
|
| 142 | - |
|
| 143 | - /** |
|
| 144 | - * creates buttons for selecting number of attendees for an event |
|
| 145 | - * |
|
| 146 | - * @param \WP_Post|int $event |
|
| 147 | - * @param bool $view_details |
|
| 148 | - * @return string |
|
| 149 | - * @throws \EE_Error |
|
| 150 | - */ |
|
| 151 | - public function display( $event = null, $view_details = false ) |
|
| 152 | - { |
|
| 153 | - // reset filter for displaying submit button |
|
| 154 | - remove_filter( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true' ); |
|
| 155 | - // poke and prod incoming event till it tells us what it is |
|
| 156 | - if ( ! $this->setEvent( $event ) ) { |
|
| 157 | - return false; |
|
| 158 | - } |
|
| 159 | - // begin gathering template arguments by getting event status |
|
| 160 | - $template_args = array( 'event_status' => $this->event->get_active_status() ); |
|
| 161 | - if ( $this->activeEventAndShowTicketSelector($event, $template_args['event_status'], $view_details) ) { |
|
| 162 | - return ! is_single() ? $this->displayViewDetailsButton() : ''; |
|
| 163 | - } |
|
| 164 | - // filter the maximum qty that can appear in the Ticket Selector qty dropdowns |
|
| 165 | - $this->setMaxAttendees($this->event->additional_limit()); |
|
| 166 | - if ($this->getMaxAttendees() < 1) { |
|
| 167 | - return $this->ticketSalesClosedMessage(); |
|
| 168 | - } |
|
| 169 | - // is the event expired ? |
|
| 170 | - $template_args['event_is_expired'] = $this->event->is_expired(); |
|
| 171 | - if ( $template_args[ 'event_is_expired' ] ) { |
|
| 172 | - return $this->expiredEventMessage(); |
|
| 173 | - } |
|
| 174 | - // get all tickets for this event ordered by the datetime |
|
| 175 | - $tickets = $this->getTickets(); |
|
| 176 | - if (count($tickets) < 1) { |
|
| 177 | - return $this->noTicketAvailableMessage(); |
|
| 178 | - } |
|
| 179 | - if (\EED_Events_Archive::is_iframe()){ |
|
| 180 | - $this->setIframe(); |
|
| 181 | - } |
|
| 182 | - // redirecting to another site for registration ?? |
|
| 183 | - $external_url = (string) $this->event->external_url(); |
|
| 184 | - // if redirecting to another site for registration, then we don't load the TS |
|
| 185 | - $ticket_selector = $external_url |
|
| 186 | - ? $this->externalEventRegistration() |
|
| 187 | - : $this->loadTicketSelector($tickets,$template_args); |
|
| 188 | - // now set up the form (but not for the admin) |
|
| 189 | - $ticket_selector = ! is_admin() |
|
| 190 | - ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
| 191 | - : $ticket_selector; |
|
| 192 | - // submit button and form close tag |
|
| 193 | - $ticket_selector .= ! is_admin() ? $this->displaySubmitButton($external_url) : ''; |
|
| 194 | - return $ticket_selector; |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - |
|
| 198 | - |
|
| 199 | - /** |
|
| 200 | - * displayTicketSelector |
|
| 201 | - * examines the event properties and determines whether a Ticket Selector should be displayed |
|
| 202 | - * |
|
| 203 | - * @param \WP_Post|int $event |
|
| 204 | - * @param string $_event_active_status |
|
| 205 | - * @param bool $view_details |
|
| 206 | - * @return bool |
|
| 207 | - * @throws \EE_Error |
|
| 208 | - */ |
|
| 209 | - protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details) |
|
| 210 | - { |
|
| 211 | - $event_post = $this->event instanceof \EE_Event ? $this->event->ID() : $event; |
|
| 212 | - return ! is_admin() |
|
| 213 | - && ( |
|
| 214 | - ! $this->event->display_ticket_selector() |
|
| 215 | - || $view_details |
|
| 216 | - || post_password_required($event_post) |
|
| 217 | - || ( |
|
| 218 | - $_event_active_status !== \EE_Datetime::active |
|
| 219 | - && $_event_active_status !== \EE_Datetime::upcoming |
|
| 220 | - && $_event_active_status !== \EE_Datetime::sold_out |
|
| 221 | - && ! ( |
|
| 222 | - $_event_active_status === \EE_Datetime::inactive |
|
| 223 | - && is_user_logged_in() |
|
| 224 | - ) |
|
| 225 | - ) |
|
| 226 | - ); |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - |
|
| 230 | - |
|
| 231 | - /** |
|
| 232 | - * noTicketAvailableMessage |
|
| 233 | - * notice displayed if event is expired |
|
| 234 | - * |
|
| 235 | - * @return string |
|
| 236 | - * @throws \EE_Error |
|
| 237 | - */ |
|
| 238 | - protected function expiredEventMessage() |
|
| 239 | - { |
|
| 240 | - return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
| 241 | - 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
|
| 242 | - 'event_espresso' |
|
| 243 | - ) . '</span></div>'; |
|
| 244 | - } |
|
| 245 | - |
|
| 246 | - |
|
| 247 | - |
|
| 248 | - /** |
|
| 249 | - * noTicketAvailableMessage |
|
| 250 | - * notice displayed if event has no more tickets available |
|
| 251 | - * |
|
| 252 | - * @return string |
|
| 253 | - * @throws \EE_Error |
|
| 254 | - */ |
|
| 255 | - protected function noTicketAvailableMessage() |
|
| 256 | - { |
|
| 257 | - $no_ticket_available_msg = esc_html__( 'We\'re sorry, but all ticket sales have ended.', 'event_espresso' ); |
|
| 258 | - if (current_user_can('edit_post', $this->event->ID())) { |
|
| 259 | - $no_ticket_available_msg .= sprintf( |
|
| 260 | - esc_html__( |
|
| 261 | - '%1$sNote to Event Admin:%2$sNo tickets were found for this event. This effectively turns off ticket sales. Please ensure that at least one ticket is available for if you want people to be able to register.%3$s(click to edit this event)%4$s', |
|
| 262 | - 'event_espresso' |
|
| 263 | - ), |
|
| 264 | - '<div class="ee-attention" style="text-align: left;"><b>', |
|
| 265 | - '</b><br />', |
|
| 266 | - '<span class="edit-link"><a class="post-edit-link" href="'.get_edit_post_link($this->event->ID()).'">', |
|
| 267 | - '</a></span></div>' |
|
| 268 | - ); |
|
| 269 | - } |
|
| 270 | - return ' |
|
| 22 | + /** |
|
| 23 | + * event that ticket selector is being generated for |
|
| 24 | + * |
|
| 25 | + * @access protected |
|
| 26 | + * @var \EE_Event $event |
|
| 27 | + */ |
|
| 28 | + protected $event; |
|
| 29 | + |
|
| 30 | + /** |
|
| 31 | + * Used to flag when the ticket selector is being called from an external iframe. |
|
| 32 | + * |
|
| 33 | + * @var bool $iframe |
|
| 34 | + */ |
|
| 35 | + protected $iframe = false; |
|
| 36 | + |
|
| 37 | + /** |
|
| 38 | + * max attendees that can register for event at one time |
|
| 39 | + * |
|
| 40 | + * @var int $max_attendees |
|
| 41 | + */ |
|
| 42 | + private $max_attendees = EE_INF; |
|
| 43 | + |
|
| 44 | + /** |
|
| 45 | + *@var string $date_format |
|
| 46 | + */ |
|
| 47 | + private $date_format = ''; |
|
| 48 | + |
|
| 49 | + /** |
|
| 50 | + *@var string $time_format |
|
| 51 | + */ |
|
| 52 | + private $time_format = ''; |
|
| 53 | + |
|
| 54 | + |
|
| 55 | + |
|
| 56 | + /** |
|
| 57 | + * DisplayTicketSelector constructor. |
|
| 58 | + */ |
|
| 59 | + public function __construct() |
|
| 60 | + { |
|
| 61 | + $this->date_format = apply_filters( |
|
| 62 | + 'FHEE__EED_Ticket_Selector__display_ticket_selector__date_format', |
|
| 63 | + get_option('date_format') |
|
| 64 | + ); |
|
| 65 | + $this->time_format = apply_filters( |
|
| 66 | + 'FHEE__EED_Ticket_Selector__display_ticket_selector__time_format', |
|
| 67 | + get_option('time_format') |
|
| 68 | + ); |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + |
|
| 72 | + |
|
| 73 | + /** |
|
| 74 | + * @param boolean $iframe |
|
| 75 | + */ |
|
| 76 | + public function setIframe( $iframe = true ) |
|
| 77 | + { |
|
| 78 | + $this->iframe = filter_var( $iframe, FILTER_VALIDATE_BOOLEAN ); |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + |
|
| 82 | + |
|
| 83 | + /** |
|
| 84 | + * finds and sets the \EE_Event object for use throughout class |
|
| 85 | + * |
|
| 86 | + * @param mixed $event |
|
| 87 | + * @return bool |
|
| 88 | + */ |
|
| 89 | + protected function setEvent( $event = null ) |
|
| 90 | + { |
|
| 91 | + if ( $event === null ) { |
|
| 92 | + global $post; |
|
| 93 | + $event = $post; |
|
| 94 | + } |
|
| 95 | + if ( $event instanceof \EE_Event ) { |
|
| 96 | + $this->event = $event; |
|
| 97 | + } else if ( $event instanceof \WP_Post ) { |
|
| 98 | + if ( isset( $event->EE_Event ) && $event->EE_Event instanceof \EE_Event ) { |
|
| 99 | + $this->event = $event->EE_Event; |
|
| 100 | + } else if ( $event->post_type === 'espresso_events' ) { |
|
| 101 | + $event->EE_Event = \EEM_Event::instance()->instantiate_class_from_post_object( $event ); |
|
| 102 | + $this->event = $event->EE_Event; |
|
| 103 | + } |
|
| 104 | + } else { |
|
| 105 | + $user_msg = __( 'No Event object or an invalid Event object was supplied.', 'event_espresso' ); |
|
| 106 | + $dev_msg = $user_msg . __( |
|
| 107 | + 'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.', |
|
| 108 | + 'event_espresso' |
|
| 109 | + ); |
|
| 110 | + \EE_Error::add_error( $user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__ ); |
|
| 111 | + return false; |
|
| 112 | + } |
|
| 113 | + return true; |
|
| 114 | + } |
|
| 115 | + |
|
| 116 | + |
|
| 117 | + |
|
| 118 | + /** |
|
| 119 | + * @return int |
|
| 120 | + */ |
|
| 121 | + public function getMaxAttendees() |
|
| 122 | + { |
|
| 123 | + return $this->max_attendees; |
|
| 124 | + } |
|
| 125 | + |
|
| 126 | + |
|
| 127 | + |
|
| 128 | + /** |
|
| 129 | + * @param int $max_attendees |
|
| 130 | + */ |
|
| 131 | + public function setMaxAttendees($max_attendees) |
|
| 132 | + { |
|
| 133 | + $this->max_attendees = absint( |
|
| 134 | + apply_filters( |
|
| 135 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector__max_tickets', |
|
| 136 | + $max_attendees |
|
| 137 | + ) |
|
| 138 | + ); |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + |
|
| 142 | + |
|
| 143 | + /** |
|
| 144 | + * creates buttons for selecting number of attendees for an event |
|
| 145 | + * |
|
| 146 | + * @param \WP_Post|int $event |
|
| 147 | + * @param bool $view_details |
|
| 148 | + * @return string |
|
| 149 | + * @throws \EE_Error |
|
| 150 | + */ |
|
| 151 | + public function display( $event = null, $view_details = false ) |
|
| 152 | + { |
|
| 153 | + // reset filter for displaying submit button |
|
| 154 | + remove_filter( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true' ); |
|
| 155 | + // poke and prod incoming event till it tells us what it is |
|
| 156 | + if ( ! $this->setEvent( $event ) ) { |
|
| 157 | + return false; |
|
| 158 | + } |
|
| 159 | + // begin gathering template arguments by getting event status |
|
| 160 | + $template_args = array( 'event_status' => $this->event->get_active_status() ); |
|
| 161 | + if ( $this->activeEventAndShowTicketSelector($event, $template_args['event_status'], $view_details) ) { |
|
| 162 | + return ! is_single() ? $this->displayViewDetailsButton() : ''; |
|
| 163 | + } |
|
| 164 | + // filter the maximum qty that can appear in the Ticket Selector qty dropdowns |
|
| 165 | + $this->setMaxAttendees($this->event->additional_limit()); |
|
| 166 | + if ($this->getMaxAttendees() < 1) { |
|
| 167 | + return $this->ticketSalesClosedMessage(); |
|
| 168 | + } |
|
| 169 | + // is the event expired ? |
|
| 170 | + $template_args['event_is_expired'] = $this->event->is_expired(); |
|
| 171 | + if ( $template_args[ 'event_is_expired' ] ) { |
|
| 172 | + return $this->expiredEventMessage(); |
|
| 173 | + } |
|
| 174 | + // get all tickets for this event ordered by the datetime |
|
| 175 | + $tickets = $this->getTickets(); |
|
| 176 | + if (count($tickets) < 1) { |
|
| 177 | + return $this->noTicketAvailableMessage(); |
|
| 178 | + } |
|
| 179 | + if (\EED_Events_Archive::is_iframe()){ |
|
| 180 | + $this->setIframe(); |
|
| 181 | + } |
|
| 182 | + // redirecting to another site for registration ?? |
|
| 183 | + $external_url = (string) $this->event->external_url(); |
|
| 184 | + // if redirecting to another site for registration, then we don't load the TS |
|
| 185 | + $ticket_selector = $external_url |
|
| 186 | + ? $this->externalEventRegistration() |
|
| 187 | + : $this->loadTicketSelector($tickets,$template_args); |
|
| 188 | + // now set up the form (but not for the admin) |
|
| 189 | + $ticket_selector = ! is_admin() |
|
| 190 | + ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
| 191 | + : $ticket_selector; |
|
| 192 | + // submit button and form close tag |
|
| 193 | + $ticket_selector .= ! is_admin() ? $this->displaySubmitButton($external_url) : ''; |
|
| 194 | + return $ticket_selector; |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + |
|
| 198 | + |
|
| 199 | + /** |
|
| 200 | + * displayTicketSelector |
|
| 201 | + * examines the event properties and determines whether a Ticket Selector should be displayed |
|
| 202 | + * |
|
| 203 | + * @param \WP_Post|int $event |
|
| 204 | + * @param string $_event_active_status |
|
| 205 | + * @param bool $view_details |
|
| 206 | + * @return bool |
|
| 207 | + * @throws \EE_Error |
|
| 208 | + */ |
|
| 209 | + protected function activeEventAndShowTicketSelector($event, $_event_active_status, $view_details) |
|
| 210 | + { |
|
| 211 | + $event_post = $this->event instanceof \EE_Event ? $this->event->ID() : $event; |
|
| 212 | + return ! is_admin() |
|
| 213 | + && ( |
|
| 214 | + ! $this->event->display_ticket_selector() |
|
| 215 | + || $view_details |
|
| 216 | + || post_password_required($event_post) |
|
| 217 | + || ( |
|
| 218 | + $_event_active_status !== \EE_Datetime::active |
|
| 219 | + && $_event_active_status !== \EE_Datetime::upcoming |
|
| 220 | + && $_event_active_status !== \EE_Datetime::sold_out |
|
| 221 | + && ! ( |
|
| 222 | + $_event_active_status === \EE_Datetime::inactive |
|
| 223 | + && is_user_logged_in() |
|
| 224 | + ) |
|
| 225 | + ) |
|
| 226 | + ); |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + |
|
| 230 | + |
|
| 231 | + /** |
|
| 232 | + * noTicketAvailableMessage |
|
| 233 | + * notice displayed if event is expired |
|
| 234 | + * |
|
| 235 | + * @return string |
|
| 236 | + * @throws \EE_Error |
|
| 237 | + */ |
|
| 238 | + protected function expiredEventMessage() |
|
| 239 | + { |
|
| 240 | + return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
| 241 | + 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
|
| 242 | + 'event_espresso' |
|
| 243 | + ) . '</span></div>'; |
|
| 244 | + } |
|
| 245 | + |
|
| 246 | + |
|
| 247 | + |
|
| 248 | + /** |
|
| 249 | + * noTicketAvailableMessage |
|
| 250 | + * notice displayed if event has no more tickets available |
|
| 251 | + * |
|
| 252 | + * @return string |
|
| 253 | + * @throws \EE_Error |
|
| 254 | + */ |
|
| 255 | + protected function noTicketAvailableMessage() |
|
| 256 | + { |
|
| 257 | + $no_ticket_available_msg = esc_html__( 'We\'re sorry, but all ticket sales have ended.', 'event_espresso' ); |
|
| 258 | + if (current_user_can('edit_post', $this->event->ID())) { |
|
| 259 | + $no_ticket_available_msg .= sprintf( |
|
| 260 | + esc_html__( |
|
| 261 | + '%1$sNote to Event Admin:%2$sNo tickets were found for this event. This effectively turns off ticket sales. Please ensure that at least one ticket is available for if you want people to be able to register.%3$s(click to edit this event)%4$s', |
|
| 262 | + 'event_espresso' |
|
| 263 | + ), |
|
| 264 | + '<div class="ee-attention" style="text-align: left;"><b>', |
|
| 265 | + '</b><br />', |
|
| 266 | + '<span class="edit-link"><a class="post-edit-link" href="'.get_edit_post_link($this->event->ID()).'">', |
|
| 267 | + '</a></span></div>' |
|
| 268 | + ); |
|
| 269 | + } |
|
| 270 | + return ' |
|
| 271 | 271 | <div class="ee-event-expired-notice"> |
| 272 | 272 | <span class="important-notice">' . $no_ticket_available_msg . '</span> |
| 273 | 273 | </div>'; |
| 274 | - } |
|
| 275 | - |
|
| 276 | - |
|
| 277 | - |
|
| 278 | - /** |
|
| 279 | - * ticketSalesClosed |
|
| 280 | - * notice displayed if event ticket sales are turned off |
|
| 281 | - * |
|
| 282 | - * @return string |
|
| 283 | - * @throws \EE_Error |
|
| 284 | - */ |
|
| 285 | - protected function ticketSalesClosedMessage() |
|
| 286 | - { |
|
| 287 | - $sales_closed_msg = esc_html__( |
|
| 288 | - 'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.', |
|
| 289 | - 'event_espresso' |
|
| 290 | - ); |
|
| 291 | - if (current_user_can('edit_post', $this->event->ID())) { |
|
| 292 | - $sales_closed_msg .= sprintf( |
|
| 293 | - esc_html__( |
|
| 294 | - '%sNote to Event Admin:%sThe "Maximum number of tickets allowed per order for this event" in the Event Registration Options has been set to "0". This effectively turns off ticket sales. %s(click to edit this event)%s', |
|
| 295 | - 'event_espresso' |
|
| 296 | - ), |
|
| 297 | - '<div class="ee-attention" style="text-align: left;"><b>', |
|
| 298 | - '</b><br />', |
|
| 299 | - '<span class="edit-link"><a class="post-edit-link" href="'.get_edit_post_link($this->event->ID()).'">', |
|
| 300 | - '</a></span></div>' |
|
| 301 | - ); |
|
| 302 | - } |
|
| 303 | - return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
| 304 | - } |
|
| 305 | - |
|
| 306 | - |
|
| 307 | - |
|
| 308 | - /** |
|
| 309 | - * getTickets |
|
| 310 | - * |
|
| 311 | - * @return \EE_Base_Class[]|\EE_Ticket[] |
|
| 312 | - * @throws \EE_Error |
|
| 313 | - */ |
|
| 314 | - protected function getTickets() |
|
| 315 | - { |
|
| 316 | - $ticket_query_args = array( |
|
| 317 | - array('Datetime.EVT_ID' => $this->event->ID()), |
|
| 318 | - 'order_by' => array( |
|
| 319 | - 'TKT_order' => 'ASC', |
|
| 320 | - 'TKT_required' => 'DESC', |
|
| 321 | - 'TKT_start_date' => 'ASC', |
|
| 322 | - 'TKT_end_date' => 'ASC', |
|
| 323 | - 'Datetime.DTT_EVT_start' => 'DESC', |
|
| 324 | - ), |
|
| 325 | - ); |
|
| 326 | - if ( ! \EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets) { |
|
| 327 | - //use the correct applicable time query depending on what version of core is being run. |
|
| 328 | - $current_time = method_exists('EEM_Datetime', 'current_time_for_query') |
|
| 329 | - ? time() |
|
| 330 | - : current_time('timestamp'); |
|
| 331 | - $ticket_query_args[0]['TKT_end_date'] = array('>', $current_time); |
|
| 332 | - } |
|
| 333 | - return \EEM_Ticket::instance()->get_all($ticket_query_args); |
|
| 334 | - } |
|
| 335 | - |
|
| 336 | - |
|
| 337 | - |
|
| 338 | - /** |
|
| 339 | - * loadTicketSelector |
|
| 340 | - * begins to assemble template arguments |
|
| 341 | - * and decides whether to load a "simple" ticket selector, or the standard |
|
| 342 | - * |
|
| 343 | - * @param \EE_Ticket[] $tickets |
|
| 344 | - * @param array $template_args |
|
| 345 | - * @return string |
|
| 346 | - * @throws \EE_Error |
|
| 347 | - */ |
|
| 348 | - protected function loadTicketSelector(array $tickets, array $template_args) |
|
| 349 | - { |
|
| 350 | - $template_args['event'] = $this->event; |
|
| 351 | - $template_args['EVT_ID'] = $this->event->ID(); |
|
| 352 | - $template_args['event_is_expired'] = $this->event->is_expired(); |
|
| 353 | - $template_args['max_atndz'] = $this->getMaxAttendees(); |
|
| 354 | - $template_args['date_format'] = $this->date_format; |
|
| 355 | - $template_args['time_format'] = $this->time_format; |
|
| 356 | - /** |
|
| 357 | - * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected |
|
| 358 | - * |
|
| 359 | - * @since 4.9.13 |
|
| 360 | - * @param string '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to |
|
| 361 | - * @param int $EVT_ID The Event ID |
|
| 362 | - */ |
|
| 363 | - $template_args['anchor_id'] = apply_filters( |
|
| 364 | - 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
|
| 365 | - '#tkt-slctr-tbl-' . $this->event->ID(), |
|
| 366 | - $this->event->ID() |
|
| 367 | - ); |
|
| 368 | - $template_args['tickets'] = $tickets; |
|
| 369 | - $template_args['ticket_count'] = count($tickets); |
|
| 370 | - $ticket_selector = $this->simpleTicketSelector( $tickets, $template_args); |
|
| 371 | - return $ticket_selector instanceof TicketSelectorSimple |
|
| 372 | - ? $ticket_selector |
|
| 373 | - : new TicketSelectorStandard( |
|
| 374 | - $this->event, |
|
| 375 | - $tickets, |
|
| 376 | - $this->getMaxAttendees(), |
|
| 377 | - $template_args, |
|
| 378 | - $this->date_format, |
|
| 379 | - $this->time_format |
|
| 380 | - ); |
|
| 381 | - } |
|
| 382 | - |
|
| 383 | - |
|
| 384 | - |
|
| 385 | - /** |
|
| 386 | - * simpleTicketSelector |
|
| 387 | - * there's one ticket, and max attendees is set to one, |
|
| 388 | - * so if the event is free, then this is a "simple" ticket selector |
|
| 389 | - * a.k.a. "Dude Where's my Ticket Selector?" |
|
| 390 | - * |
|
| 391 | - * @param \EE_Ticket[] $tickets |
|
| 392 | - * @param array $template_args |
|
| 393 | - * @return string |
|
| 394 | - * @throws \EE_Error |
|
| 395 | - */ |
|
| 396 | - protected function simpleTicketSelector($tickets, array $template_args) |
|
| 397 | - { |
|
| 398 | - // if there is only ONE ticket with a max qty of ONE |
|
| 399 | - if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) { |
|
| 400 | - return ''; |
|
| 401 | - } |
|
| 402 | - /** @var \EE_Ticket $ticket */ |
|
| 403 | - $ticket = reset($tickets); |
|
| 404 | - // if the ticket is free... then not much need for the ticket selector |
|
| 405 | - if ( |
|
| 406 | - apply_filters( |
|
| 407 | - 'FHEE__ticket_selector_chart_template__hide_ticket_selector', |
|
| 408 | - $ticket->is_free(), |
|
| 409 | - $this->event->ID() |
|
| 410 | - ) |
|
| 411 | - ) { |
|
| 412 | - return new TicketSelectorSimple( |
|
| 413 | - $this->event, |
|
| 414 | - $ticket, |
|
| 415 | - $this->getMaxAttendees(), |
|
| 416 | - $template_args |
|
| 417 | - ); |
|
| 418 | - } |
|
| 419 | - return ''; |
|
| 420 | - } |
|
| 421 | - |
|
| 422 | - |
|
| 423 | - |
|
| 424 | - /** |
|
| 425 | - * externalEventRegistration |
|
| 426 | - * |
|
| 427 | - * @return string |
|
| 428 | - */ |
|
| 429 | - public function externalEventRegistration() |
|
| 430 | - { |
|
| 431 | - // if not we still need to trigger the display of the submit button |
|
| 432 | - add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true'); |
|
| 433 | - //display notice to admin that registration is external |
|
| 434 | - return is_admin() |
|
| 435 | - ? esc_html__( |
|
| 436 | - 'Registration is at an external URL for this event.', |
|
| 437 | - 'event_espresso' |
|
| 438 | - ) |
|
| 439 | - : ''; |
|
| 440 | - } |
|
| 441 | - |
|
| 442 | - |
|
| 443 | - |
|
| 444 | - /** |
|
| 445 | - * formOpen |
|
| 446 | - * |
|
| 447 | - * @param int $ID |
|
| 448 | - * @param string $external_url |
|
| 449 | - * @return string |
|
| 450 | - */ |
|
| 451 | - public function formOpen( $ID = 0, $external_url = '' ) |
|
| 452 | - { |
|
| 453 | - // if redirecting, we don't need any anything else |
|
| 454 | - if ( $external_url ) { |
|
| 455 | - $html = '<form method="GET" action="' . \EEH_URL::refactor_url($external_url) . '"'; |
|
| 456 | - // open link in new window ? |
|
| 457 | - $html .= apply_filters( |
|
| 458 | - 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
|
| 459 | - \EED_Events_Archive::is_iframe() |
|
| 460 | - ) |
|
| 461 | - ? ' target="_blank"' |
|
| 462 | - : ''; |
|
| 463 | - $html .= '>'; |
|
| 464 | - $query_args = \EEH_URL::get_query_string( $external_url ); |
|
| 465 | - foreach ( (array)$query_args as $query_arg => $value ) { |
|
| 466 | - $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
| 467 | - } |
|
| 468 | - return $html; |
|
| 469 | - } |
|
| 470 | - // if there is no submit button, then don't start building a form |
|
| 471 | - // because the "View Details" button will build its own form |
|
| 472 | - if ( ! apply_filters( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false ) ) { |
|
| 473 | - return ''; |
|
| 474 | - } |
|
| 475 | - $checkout_url = \EEH_Event_View::event_link_url( $ID ); |
|
| 476 | - if ( ! $checkout_url ) { |
|
| 477 | - \EE_Error::add_error( |
|
| 478 | - esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 479 | - __FILE__, |
|
| 480 | - __FUNCTION__, |
|
| 481 | - __LINE__ |
|
| 482 | - ); |
|
| 483 | - } |
|
| 484 | - // set no cache headers and constants |
|
| 485 | - \EE_System::do_not_cache(); |
|
| 486 | - $extra_params = $this->iframe ? ' target="_blank"' : ''; |
|
| 487 | - $html = '<form method="POST" action="' . $checkout_url . '"' . $extra_params . '>'; |
|
| 488 | - $html .= wp_nonce_field( 'process_ticket_selections', 'process_ticket_selections_nonce_' . $ID, true, false ); |
|
| 489 | - $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
|
| 490 | - $html = apply_filters( 'FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event ); |
|
| 491 | - return $html; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - |
|
| 495 | - |
|
| 496 | - /** |
|
| 497 | - * displaySubmitButton |
|
| 498 | - * |
|
| 499 | - * @param string $external_url |
|
| 500 | - * @return string |
|
| 501 | - * @throws \EE_Error |
|
| 502 | - */ |
|
| 503 | - public function displaySubmitButton($external_url = '') |
|
| 504 | - { |
|
| 505 | - $html = ''; |
|
| 506 | - if ( ! is_admin()) { |
|
| 507 | - // standard TS displayed with submit button, ie: "Register Now" |
|
| 508 | - if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
| 509 | - $html .= $this->displayRegisterNowButton(); |
|
| 510 | - $html .= empty($external_url) |
|
| 511 | - ? $this->ticketSelectorEndDiv() |
|
| 512 | - : $this->clearTicketSelector(); |
|
| 513 | - $html .= '<br/>' . $this->formClose(); |
|
| 514 | - } else if ($this->getMaxAttendees() === 1) { |
|
| 515 | - // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
|
| 516 | - if ($this->event->is_sold_out()) { |
|
| 517 | - // then instead of a View Details or Submit button, just display a "Sold Out" message |
|
| 518 | - $html .= apply_filters( |
|
| 519 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg', |
|
| 520 | - sprintf( |
|
| 521 | - __( |
|
| 522 | - '%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s', |
|
| 523 | - 'event_espresso' |
|
| 524 | - ), |
|
| 525 | - '<p class="no-ticket-selector-msg clear-float">', |
|
| 526 | - $this->event->name(), |
|
| 527 | - '</p>', |
|
| 528 | - '<br />' |
|
| 529 | - ), |
|
| 530 | - $this->event |
|
| 531 | - ); |
|
| 532 | - if ( |
|
| 533 | - apply_filters( |
|
| 534 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
| 535 | - false, |
|
| 536 | - $this->event |
|
| 537 | - ) |
|
| 538 | - ) { |
|
| 539 | - $html .= $this->displayRegisterNowButton(); |
|
| 540 | - } |
|
| 541 | - // sold out DWMTS event, no TS, no submit or view details button, but has additional content |
|
| 542 | - $html .= $this->ticketSelectorEndDiv(); |
|
| 543 | - } else if ( |
|
| 544 | - apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false) |
|
| 545 | - && ! is_single() |
|
| 546 | - ) { |
|
| 547 | - // this is a "Dude Where's my Ticket Selector?" (DWMTS) type event, |
|
| 548 | - // but no tickets are available, so display event's "View Details" button. |
|
| 549 | - // it is being viewed via somewhere other than a single post |
|
| 550 | - $html .= $this->displayViewDetailsButton(true); |
|
| 551 | - } |
|
| 552 | - } else if (is_archive()) { |
|
| 553 | - // event list, no tickets available so display event's "View Details" button |
|
| 554 | - $html .= $this->ticketSelectorEndDiv(); |
|
| 555 | - $html .= $this->displayViewDetailsButton(); |
|
| 556 | - } else { |
|
| 557 | - if ( |
|
| 558 | - apply_filters( |
|
| 559 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
| 560 | - false, |
|
| 561 | - $this->event |
|
| 562 | - ) |
|
| 563 | - ) { |
|
| 564 | - $html .= $this->displayRegisterNowButton(); |
|
| 565 | - } |
|
| 566 | - // no submit or view details button, and no additional content |
|
| 567 | - $html .= $this->ticketSelectorEndDiv(); |
|
| 568 | - } |
|
| 569 | - if ( ! $this->iframe && ! is_archive()) { |
|
| 570 | - $html .= \EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector')); |
|
| 571 | - } |
|
| 572 | - } |
|
| 573 | - return $html; |
|
| 574 | - } |
|
| 575 | - |
|
| 576 | - |
|
| 577 | - |
|
| 578 | - /** |
|
| 579 | - * @return string |
|
| 580 | - * @throws \EE_Error |
|
| 581 | - */ |
|
| 582 | - public function displayRegisterNowButton() |
|
| 583 | - { |
|
| 584 | - $btn_text = apply_filters( |
|
| 585 | - 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text', |
|
| 586 | - __('Register Now', 'event_espresso'), |
|
| 587 | - $this->event |
|
| 588 | - ); |
|
| 589 | - $external_url = $this->event->external_url(); |
|
| 590 | - $html = \EEH_HTML::div( |
|
| 591 | - '', 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', 'ticket-selector-submit-btn-wrap' |
|
| 592 | - ); |
|
| 593 | - $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
| 594 | - $html .= ' class="ticket-selector-submit-btn '; |
|
| 595 | - $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
|
| 596 | - $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
| 597 | - $html .= \EEH_HTML::divx(); |
|
| 598 | - $html .= apply_filters( |
|
| 599 | - 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
|
| 600 | - '', |
|
| 601 | - $this->event |
|
| 602 | - ); |
|
| 603 | - return $html; |
|
| 604 | - } |
|
| 605 | - |
|
| 606 | - |
|
| 607 | - /** |
|
| 608 | - * displayViewDetailsButton |
|
| 609 | - * |
|
| 610 | - * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event |
|
| 611 | - * (ie: $_max_atndz === 1) where there are no available tickets, |
|
| 612 | - * either because they are sold out, expired, or not yet on sale. |
|
| 613 | - * In this case, we need to close the form BEFORE adding any closing divs |
|
| 614 | - * @return string |
|
| 615 | - * @throws \EE_Error |
|
| 616 | - */ |
|
| 617 | - public function displayViewDetailsButton( $DWMTS = false ) |
|
| 618 | - { |
|
| 619 | - if ( ! $this->event->get_permalink() ) { |
|
| 620 | - \EE_Error::add_error( |
|
| 621 | - esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 622 | - __FILE__, __FUNCTION__, __LINE__ |
|
| 623 | - ); |
|
| 624 | - } |
|
| 625 | - $view_details_btn = '<form method="POST" action="'; |
|
| 626 | - $view_details_btn .= apply_filters( |
|
| 627 | - 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url', |
|
| 628 | - $this->event->get_permalink(), |
|
| 629 | - $this->event |
|
| 630 | - ); |
|
| 631 | - $view_details_btn .= '"'; |
|
| 632 | - // open link in new window ? |
|
| 633 | - $view_details_btn .= apply_filters( |
|
| 634 | - 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank', |
|
| 635 | - \EED_Events_Archive::is_iframe() |
|
| 636 | - ) |
|
| 637 | - ? ' target="_blank"' |
|
| 638 | - : ''; |
|
| 639 | - $view_details_btn .='>'; |
|
| 640 | - $btn_text = apply_filters( |
|
| 641 | - 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text', |
|
| 642 | - esc_html__('View Details', 'event_espresso'), |
|
| 643 | - $this->event |
|
| 644 | - ); |
|
| 645 | - $view_details_btn .= '<input id="ticket-selector-submit-' |
|
| 646 | - . $this->event->ID() |
|
| 647 | - . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="' |
|
| 648 | - . $btn_text |
|
| 649 | - . '" />'; |
|
| 650 | - $view_details_btn .= apply_filters( 'FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event ); |
|
| 651 | - if ($DWMTS) { |
|
| 652 | - $view_details_btn .= $this->formClose(); |
|
| 653 | - $view_details_btn .= $this->ticketSelectorEndDiv(); |
|
| 654 | - $view_details_btn .= '<br/>'; |
|
| 655 | - } else { |
|
| 656 | - $view_details_btn .= $this->clearTicketSelector(); |
|
| 657 | - $view_details_btn .= '<br/>'; |
|
| 658 | - $view_details_btn .= $this->formClose(); |
|
| 659 | - } |
|
| 660 | - return $view_details_btn; |
|
| 661 | - } |
|
| 662 | - |
|
| 663 | - |
|
| 664 | - |
|
| 665 | - /** |
|
| 666 | - * @return string |
|
| 667 | - */ |
|
| 668 | - public function ticketSelectorEndDiv() |
|
| 669 | - { |
|
| 670 | - return '<div class="clear"></div></div>'; |
|
| 671 | - } |
|
| 672 | - |
|
| 673 | - |
|
| 674 | - |
|
| 675 | - /** |
|
| 676 | - * @return string |
|
| 677 | - */ |
|
| 678 | - public function clearTicketSelector() |
|
| 679 | - { |
|
| 680 | - // standard TS displayed, appears after a "Register Now" or "view Details" button |
|
| 681 | - return '<div class="clear"></div>'; |
|
| 682 | - } |
|
| 683 | - |
|
| 684 | - |
|
| 685 | - |
|
| 686 | - /** |
|
| 687 | - * @access public |
|
| 688 | - * @return string |
|
| 689 | - */ |
|
| 690 | - public function formClose() |
|
| 691 | - { |
|
| 692 | - return '</form>'; |
|
| 693 | - } |
|
| 274 | + } |
|
| 275 | + |
|
| 276 | + |
|
| 277 | + |
|
| 278 | + /** |
|
| 279 | + * ticketSalesClosed |
|
| 280 | + * notice displayed if event ticket sales are turned off |
|
| 281 | + * |
|
| 282 | + * @return string |
|
| 283 | + * @throws \EE_Error |
|
| 284 | + */ |
|
| 285 | + protected function ticketSalesClosedMessage() |
|
| 286 | + { |
|
| 287 | + $sales_closed_msg = esc_html__( |
|
| 288 | + 'We\'re sorry, but ticket sales have been closed at this time. Please check back again later.', |
|
| 289 | + 'event_espresso' |
|
| 290 | + ); |
|
| 291 | + if (current_user_can('edit_post', $this->event->ID())) { |
|
| 292 | + $sales_closed_msg .= sprintf( |
|
| 293 | + esc_html__( |
|
| 294 | + '%sNote to Event Admin:%sThe "Maximum number of tickets allowed per order for this event" in the Event Registration Options has been set to "0". This effectively turns off ticket sales. %s(click to edit this event)%s', |
|
| 295 | + 'event_espresso' |
|
| 296 | + ), |
|
| 297 | + '<div class="ee-attention" style="text-align: left;"><b>', |
|
| 298 | + '</b><br />', |
|
| 299 | + '<span class="edit-link"><a class="post-edit-link" href="'.get_edit_post_link($this->event->ID()).'">', |
|
| 300 | + '</a></span></div>' |
|
| 301 | + ); |
|
| 302 | + } |
|
| 303 | + return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
| 304 | + } |
|
| 305 | + |
|
| 306 | + |
|
| 307 | + |
|
| 308 | + /** |
|
| 309 | + * getTickets |
|
| 310 | + * |
|
| 311 | + * @return \EE_Base_Class[]|\EE_Ticket[] |
|
| 312 | + * @throws \EE_Error |
|
| 313 | + */ |
|
| 314 | + protected function getTickets() |
|
| 315 | + { |
|
| 316 | + $ticket_query_args = array( |
|
| 317 | + array('Datetime.EVT_ID' => $this->event->ID()), |
|
| 318 | + 'order_by' => array( |
|
| 319 | + 'TKT_order' => 'ASC', |
|
| 320 | + 'TKT_required' => 'DESC', |
|
| 321 | + 'TKT_start_date' => 'ASC', |
|
| 322 | + 'TKT_end_date' => 'ASC', |
|
| 323 | + 'Datetime.DTT_EVT_start' => 'DESC', |
|
| 324 | + ), |
|
| 325 | + ); |
|
| 326 | + if ( ! \EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector->show_expired_tickets) { |
|
| 327 | + //use the correct applicable time query depending on what version of core is being run. |
|
| 328 | + $current_time = method_exists('EEM_Datetime', 'current_time_for_query') |
|
| 329 | + ? time() |
|
| 330 | + : current_time('timestamp'); |
|
| 331 | + $ticket_query_args[0]['TKT_end_date'] = array('>', $current_time); |
|
| 332 | + } |
|
| 333 | + return \EEM_Ticket::instance()->get_all($ticket_query_args); |
|
| 334 | + } |
|
| 335 | + |
|
| 336 | + |
|
| 337 | + |
|
| 338 | + /** |
|
| 339 | + * loadTicketSelector |
|
| 340 | + * begins to assemble template arguments |
|
| 341 | + * and decides whether to load a "simple" ticket selector, or the standard |
|
| 342 | + * |
|
| 343 | + * @param \EE_Ticket[] $tickets |
|
| 344 | + * @param array $template_args |
|
| 345 | + * @return string |
|
| 346 | + * @throws \EE_Error |
|
| 347 | + */ |
|
| 348 | + protected function loadTicketSelector(array $tickets, array $template_args) |
|
| 349 | + { |
|
| 350 | + $template_args['event'] = $this->event; |
|
| 351 | + $template_args['EVT_ID'] = $this->event->ID(); |
|
| 352 | + $template_args['event_is_expired'] = $this->event->is_expired(); |
|
| 353 | + $template_args['max_atndz'] = $this->getMaxAttendees(); |
|
| 354 | + $template_args['date_format'] = $this->date_format; |
|
| 355 | + $template_args['time_format'] = $this->time_format; |
|
| 356 | + /** |
|
| 357 | + * Filters the anchor ID used when redirecting to the Ticket Selector if no quantity selected |
|
| 358 | + * |
|
| 359 | + * @since 4.9.13 |
|
| 360 | + * @param string '#tkt-slctr-tbl-' . $EVT_ID The html ID to anchor to |
|
| 361 | + * @param int $EVT_ID The Event ID |
|
| 362 | + */ |
|
| 363 | + $template_args['anchor_id'] = apply_filters( |
|
| 364 | + 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
|
| 365 | + '#tkt-slctr-tbl-' . $this->event->ID(), |
|
| 366 | + $this->event->ID() |
|
| 367 | + ); |
|
| 368 | + $template_args['tickets'] = $tickets; |
|
| 369 | + $template_args['ticket_count'] = count($tickets); |
|
| 370 | + $ticket_selector = $this->simpleTicketSelector( $tickets, $template_args); |
|
| 371 | + return $ticket_selector instanceof TicketSelectorSimple |
|
| 372 | + ? $ticket_selector |
|
| 373 | + : new TicketSelectorStandard( |
|
| 374 | + $this->event, |
|
| 375 | + $tickets, |
|
| 376 | + $this->getMaxAttendees(), |
|
| 377 | + $template_args, |
|
| 378 | + $this->date_format, |
|
| 379 | + $this->time_format |
|
| 380 | + ); |
|
| 381 | + } |
|
| 382 | + |
|
| 383 | + |
|
| 384 | + |
|
| 385 | + /** |
|
| 386 | + * simpleTicketSelector |
|
| 387 | + * there's one ticket, and max attendees is set to one, |
|
| 388 | + * so if the event is free, then this is a "simple" ticket selector |
|
| 389 | + * a.k.a. "Dude Where's my Ticket Selector?" |
|
| 390 | + * |
|
| 391 | + * @param \EE_Ticket[] $tickets |
|
| 392 | + * @param array $template_args |
|
| 393 | + * @return string |
|
| 394 | + * @throws \EE_Error |
|
| 395 | + */ |
|
| 396 | + protected function simpleTicketSelector($tickets, array $template_args) |
|
| 397 | + { |
|
| 398 | + // if there is only ONE ticket with a max qty of ONE |
|
| 399 | + if (count($tickets) > 1 || $this->getMaxAttendees() !== 1) { |
|
| 400 | + return ''; |
|
| 401 | + } |
|
| 402 | + /** @var \EE_Ticket $ticket */ |
|
| 403 | + $ticket = reset($tickets); |
|
| 404 | + // if the ticket is free... then not much need for the ticket selector |
|
| 405 | + if ( |
|
| 406 | + apply_filters( |
|
| 407 | + 'FHEE__ticket_selector_chart_template__hide_ticket_selector', |
|
| 408 | + $ticket->is_free(), |
|
| 409 | + $this->event->ID() |
|
| 410 | + ) |
|
| 411 | + ) { |
|
| 412 | + return new TicketSelectorSimple( |
|
| 413 | + $this->event, |
|
| 414 | + $ticket, |
|
| 415 | + $this->getMaxAttendees(), |
|
| 416 | + $template_args |
|
| 417 | + ); |
|
| 418 | + } |
|
| 419 | + return ''; |
|
| 420 | + } |
|
| 421 | + |
|
| 422 | + |
|
| 423 | + |
|
| 424 | + /** |
|
| 425 | + * externalEventRegistration |
|
| 426 | + * |
|
| 427 | + * @return string |
|
| 428 | + */ |
|
| 429 | + public function externalEventRegistration() |
|
| 430 | + { |
|
| 431 | + // if not we still need to trigger the display of the submit button |
|
| 432 | + add_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true'); |
|
| 433 | + //display notice to admin that registration is external |
|
| 434 | + return is_admin() |
|
| 435 | + ? esc_html__( |
|
| 436 | + 'Registration is at an external URL for this event.', |
|
| 437 | + 'event_espresso' |
|
| 438 | + ) |
|
| 439 | + : ''; |
|
| 440 | + } |
|
| 441 | + |
|
| 442 | + |
|
| 443 | + |
|
| 444 | + /** |
|
| 445 | + * formOpen |
|
| 446 | + * |
|
| 447 | + * @param int $ID |
|
| 448 | + * @param string $external_url |
|
| 449 | + * @return string |
|
| 450 | + */ |
|
| 451 | + public function formOpen( $ID = 0, $external_url = '' ) |
|
| 452 | + { |
|
| 453 | + // if redirecting, we don't need any anything else |
|
| 454 | + if ( $external_url ) { |
|
| 455 | + $html = '<form method="GET" action="' . \EEH_URL::refactor_url($external_url) . '"'; |
|
| 456 | + // open link in new window ? |
|
| 457 | + $html .= apply_filters( |
|
| 458 | + 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
|
| 459 | + \EED_Events_Archive::is_iframe() |
|
| 460 | + ) |
|
| 461 | + ? ' target="_blank"' |
|
| 462 | + : ''; |
|
| 463 | + $html .= '>'; |
|
| 464 | + $query_args = \EEH_URL::get_query_string( $external_url ); |
|
| 465 | + foreach ( (array)$query_args as $query_arg => $value ) { |
|
| 466 | + $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
| 467 | + } |
|
| 468 | + return $html; |
|
| 469 | + } |
|
| 470 | + // if there is no submit button, then don't start building a form |
|
| 471 | + // because the "View Details" button will build its own form |
|
| 472 | + if ( ! apply_filters( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false ) ) { |
|
| 473 | + return ''; |
|
| 474 | + } |
|
| 475 | + $checkout_url = \EEH_Event_View::event_link_url( $ID ); |
|
| 476 | + if ( ! $checkout_url ) { |
|
| 477 | + \EE_Error::add_error( |
|
| 478 | + esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 479 | + __FILE__, |
|
| 480 | + __FUNCTION__, |
|
| 481 | + __LINE__ |
|
| 482 | + ); |
|
| 483 | + } |
|
| 484 | + // set no cache headers and constants |
|
| 485 | + \EE_System::do_not_cache(); |
|
| 486 | + $extra_params = $this->iframe ? ' target="_blank"' : ''; |
|
| 487 | + $html = '<form method="POST" action="' . $checkout_url . '"' . $extra_params . '>'; |
|
| 488 | + $html .= wp_nonce_field( 'process_ticket_selections', 'process_ticket_selections_nonce_' . $ID, true, false ); |
|
| 489 | + $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
|
| 490 | + $html = apply_filters( 'FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event ); |
|
| 491 | + return $html; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + |
|
| 495 | + |
|
| 496 | + /** |
|
| 497 | + * displaySubmitButton |
|
| 498 | + * |
|
| 499 | + * @param string $external_url |
|
| 500 | + * @return string |
|
| 501 | + * @throws \EE_Error |
|
| 502 | + */ |
|
| 503 | + public function displaySubmitButton($external_url = '') |
|
| 504 | + { |
|
| 505 | + $html = ''; |
|
| 506 | + if ( ! is_admin()) { |
|
| 507 | + // standard TS displayed with submit button, ie: "Register Now" |
|
| 508 | + if (apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
| 509 | + $html .= $this->displayRegisterNowButton(); |
|
| 510 | + $html .= empty($external_url) |
|
| 511 | + ? $this->ticketSelectorEndDiv() |
|
| 512 | + : $this->clearTicketSelector(); |
|
| 513 | + $html .= '<br/>' . $this->formClose(); |
|
| 514 | + } else if ($this->getMaxAttendees() === 1) { |
|
| 515 | + // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
|
| 516 | + if ($this->event->is_sold_out()) { |
|
| 517 | + // then instead of a View Details or Submit button, just display a "Sold Out" message |
|
| 518 | + $html .= apply_filters( |
|
| 519 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__sold_out_msg', |
|
| 520 | + sprintf( |
|
| 521 | + __( |
|
| 522 | + '%1$s"%2$s" is currently sold out.%4$sPlease check back again later, as spots may become available.%3$s', |
|
| 523 | + 'event_espresso' |
|
| 524 | + ), |
|
| 525 | + '<p class="no-ticket-selector-msg clear-float">', |
|
| 526 | + $this->event->name(), |
|
| 527 | + '</p>', |
|
| 528 | + '<br />' |
|
| 529 | + ), |
|
| 530 | + $this->event |
|
| 531 | + ); |
|
| 532 | + if ( |
|
| 533 | + apply_filters( |
|
| 534 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
| 535 | + false, |
|
| 536 | + $this->event |
|
| 537 | + ) |
|
| 538 | + ) { |
|
| 539 | + $html .= $this->displayRegisterNowButton(); |
|
| 540 | + } |
|
| 541 | + // sold out DWMTS event, no TS, no submit or view details button, but has additional content |
|
| 542 | + $html .= $this->ticketSelectorEndDiv(); |
|
| 543 | + } else if ( |
|
| 544 | + apply_filters('FHEE__EE_Ticket_Selector__hide_ticket_selector', false) |
|
| 545 | + && ! is_single() |
|
| 546 | + ) { |
|
| 547 | + // this is a "Dude Where's my Ticket Selector?" (DWMTS) type event, |
|
| 548 | + // but no tickets are available, so display event's "View Details" button. |
|
| 549 | + // it is being viewed via somewhere other than a single post |
|
| 550 | + $html .= $this->displayViewDetailsButton(true); |
|
| 551 | + } |
|
| 552 | + } else if (is_archive()) { |
|
| 553 | + // event list, no tickets available so display event's "View Details" button |
|
| 554 | + $html .= $this->ticketSelectorEndDiv(); |
|
| 555 | + $html .= $this->displayViewDetailsButton(); |
|
| 556 | + } else { |
|
| 557 | + if ( |
|
| 558 | + apply_filters( |
|
| 559 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__no_tickets_but_display_register_now_button', |
|
| 560 | + false, |
|
| 561 | + $this->event |
|
| 562 | + ) |
|
| 563 | + ) { |
|
| 564 | + $html .= $this->displayRegisterNowButton(); |
|
| 565 | + } |
|
| 566 | + // no submit or view details button, and no additional content |
|
| 567 | + $html .= $this->ticketSelectorEndDiv(); |
|
| 568 | + } |
|
| 569 | + if ( ! $this->iframe && ! is_archive()) { |
|
| 570 | + $html .= \EEH_Template::powered_by_event_espresso('', '', array('utm_content' => 'ticket_selector')); |
|
| 571 | + } |
|
| 572 | + } |
|
| 573 | + return $html; |
|
| 574 | + } |
|
| 575 | + |
|
| 576 | + |
|
| 577 | + |
|
| 578 | + /** |
|
| 579 | + * @return string |
|
| 580 | + * @throws \EE_Error |
|
| 581 | + */ |
|
| 582 | + public function displayRegisterNowButton() |
|
| 583 | + { |
|
| 584 | + $btn_text = apply_filters( |
|
| 585 | + 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit__btn_text', |
|
| 586 | + __('Register Now', 'event_espresso'), |
|
| 587 | + $this->event |
|
| 588 | + ); |
|
| 589 | + $external_url = $this->event->external_url(); |
|
| 590 | + $html = \EEH_HTML::div( |
|
| 591 | + '', 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', 'ticket-selector-submit-btn-wrap' |
|
| 592 | + ); |
|
| 593 | + $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
| 594 | + $html .= ' class="ticket-selector-submit-btn '; |
|
| 595 | + $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
|
| 596 | + $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
| 597 | + $html .= \EEH_HTML::divx(); |
|
| 598 | + $html .= apply_filters( |
|
| 599 | + 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
|
| 600 | + '', |
|
| 601 | + $this->event |
|
| 602 | + ); |
|
| 603 | + return $html; |
|
| 604 | + } |
|
| 605 | + |
|
| 606 | + |
|
| 607 | + /** |
|
| 608 | + * displayViewDetailsButton |
|
| 609 | + * |
|
| 610 | + * @param bool $DWMTS indicates a "Dude Where's my Ticket Selector?" (DWMTS) type event |
|
| 611 | + * (ie: $_max_atndz === 1) where there are no available tickets, |
|
| 612 | + * either because they are sold out, expired, or not yet on sale. |
|
| 613 | + * In this case, we need to close the form BEFORE adding any closing divs |
|
| 614 | + * @return string |
|
| 615 | + * @throws \EE_Error |
|
| 616 | + */ |
|
| 617 | + public function displayViewDetailsButton( $DWMTS = false ) |
|
| 618 | + { |
|
| 619 | + if ( ! $this->event->get_permalink() ) { |
|
| 620 | + \EE_Error::add_error( |
|
| 621 | + esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 622 | + __FILE__, __FUNCTION__, __LINE__ |
|
| 623 | + ); |
|
| 624 | + } |
|
| 625 | + $view_details_btn = '<form method="POST" action="'; |
|
| 626 | + $view_details_btn .= apply_filters( |
|
| 627 | + 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_url', |
|
| 628 | + $this->event->get_permalink(), |
|
| 629 | + $this->event |
|
| 630 | + ); |
|
| 631 | + $view_details_btn .= '"'; |
|
| 632 | + // open link in new window ? |
|
| 633 | + $view_details_btn .= apply_filters( |
|
| 634 | + 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__displayViewDetailsButton__url_target_blank', |
|
| 635 | + \EED_Events_Archive::is_iframe() |
|
| 636 | + ) |
|
| 637 | + ? ' target="_blank"' |
|
| 638 | + : ''; |
|
| 639 | + $view_details_btn .='>'; |
|
| 640 | + $btn_text = apply_filters( |
|
| 641 | + 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text', |
|
| 642 | + esc_html__('View Details', 'event_espresso'), |
|
| 643 | + $this->event |
|
| 644 | + ); |
|
| 645 | + $view_details_btn .= '<input id="ticket-selector-submit-' |
|
| 646 | + . $this->event->ID() |
|
| 647 | + . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="' |
|
| 648 | + . $btn_text |
|
| 649 | + . '" />'; |
|
| 650 | + $view_details_btn .= apply_filters( 'FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event ); |
|
| 651 | + if ($DWMTS) { |
|
| 652 | + $view_details_btn .= $this->formClose(); |
|
| 653 | + $view_details_btn .= $this->ticketSelectorEndDiv(); |
|
| 654 | + $view_details_btn .= '<br/>'; |
|
| 655 | + } else { |
|
| 656 | + $view_details_btn .= $this->clearTicketSelector(); |
|
| 657 | + $view_details_btn .= '<br/>'; |
|
| 658 | + $view_details_btn .= $this->formClose(); |
|
| 659 | + } |
|
| 660 | + return $view_details_btn; |
|
| 661 | + } |
|
| 662 | + |
|
| 663 | + |
|
| 664 | + |
|
| 665 | + /** |
|
| 666 | + * @return string |
|
| 667 | + */ |
|
| 668 | + public function ticketSelectorEndDiv() |
|
| 669 | + { |
|
| 670 | + return '<div class="clear"></div></div>'; |
|
| 671 | + } |
|
| 672 | + |
|
| 673 | + |
|
| 674 | + |
|
| 675 | + /** |
|
| 676 | + * @return string |
|
| 677 | + */ |
|
| 678 | + public function clearTicketSelector() |
|
| 679 | + { |
|
| 680 | + // standard TS displayed, appears after a "Register Now" or "view Details" button |
|
| 681 | + return '<div class="clear"></div>'; |
|
| 682 | + } |
|
| 683 | + |
|
| 684 | + |
|
| 685 | + |
|
| 686 | + /** |
|
| 687 | + * @access public |
|
| 688 | + * @return string |
|
| 689 | + */ |
|
| 690 | + public function formClose() |
|
| 691 | + { |
|
| 692 | + return '</form>'; |
|
| 693 | + } |
|
| 694 | 694 | |
| 695 | 695 | |
| 696 | 696 | |
@@ -1,8 +1,8 @@ discard block |
||
| 1 | 1 | <?php |
| 2 | 2 | namespace EventEspresso\modules\ticket_selector; |
| 3 | 3 | |
| 4 | -if ( ! defined( 'EVENT_ESPRESSO_VERSION' ) ) { |
|
| 5 | - exit( 'No direct script access allowed' ); |
|
| 4 | +if ( ! defined('EVENT_ESPRESSO_VERSION')) { |
|
| 5 | + exit('No direct script access allowed'); |
|
| 6 | 6 | } |
| 7 | 7 | |
| 8 | 8 | |
@@ -73,9 +73,9 @@ discard block |
||
| 73 | 73 | /** |
| 74 | 74 | * @param boolean $iframe |
| 75 | 75 | */ |
| 76 | - public function setIframe( $iframe = true ) |
|
| 76 | + public function setIframe($iframe = true) |
|
| 77 | 77 | { |
| 78 | - $this->iframe = filter_var( $iframe, FILTER_VALIDATE_BOOLEAN ); |
|
| 78 | + $this->iframe = filter_var($iframe, FILTER_VALIDATE_BOOLEAN); |
|
| 79 | 79 | } |
| 80 | 80 | |
| 81 | 81 | |
@@ -86,28 +86,28 @@ discard block |
||
| 86 | 86 | * @param mixed $event |
| 87 | 87 | * @return bool |
| 88 | 88 | */ |
| 89 | - protected function setEvent( $event = null ) |
|
| 89 | + protected function setEvent($event = null) |
|
| 90 | 90 | { |
| 91 | - if ( $event === null ) { |
|
| 91 | + if ($event === null) { |
|
| 92 | 92 | global $post; |
| 93 | 93 | $event = $post; |
| 94 | 94 | } |
| 95 | - if ( $event instanceof \EE_Event ) { |
|
| 95 | + if ($event instanceof \EE_Event) { |
|
| 96 | 96 | $this->event = $event; |
| 97 | - } else if ( $event instanceof \WP_Post ) { |
|
| 98 | - if ( isset( $event->EE_Event ) && $event->EE_Event instanceof \EE_Event ) { |
|
| 97 | + } else if ($event instanceof \WP_Post) { |
|
| 98 | + if (isset($event->EE_Event) && $event->EE_Event instanceof \EE_Event) { |
|
| 99 | 99 | $this->event = $event->EE_Event; |
| 100 | - } else if ( $event->post_type === 'espresso_events' ) { |
|
| 101 | - $event->EE_Event = \EEM_Event::instance()->instantiate_class_from_post_object( $event ); |
|
| 100 | + } else if ($event->post_type === 'espresso_events') { |
|
| 101 | + $event->EE_Event = \EEM_Event::instance()->instantiate_class_from_post_object($event); |
|
| 102 | 102 | $this->event = $event->EE_Event; |
| 103 | 103 | } |
| 104 | 104 | } else { |
| 105 | - $user_msg = __( 'No Event object or an invalid Event object was supplied.', 'event_espresso' ); |
|
| 106 | - $dev_msg = $user_msg . __( |
|
| 105 | + $user_msg = __('No Event object or an invalid Event object was supplied.', 'event_espresso'); |
|
| 106 | + $dev_msg = $user_msg.__( |
|
| 107 | 107 | 'In order to generate a ticket selector, please ensure you are passing either an EE_Event object or a WP_Post object of the post type "espresso_event" to the EE_Ticket_Selector class constructor.', |
| 108 | 108 | 'event_espresso' |
| 109 | 109 | ); |
| 110 | - \EE_Error::add_error( $user_msg . '||' . $dev_msg, __FILE__, __FUNCTION__, __LINE__ ); |
|
| 110 | + \EE_Error::add_error($user_msg.'||'.$dev_msg, __FILE__, __FUNCTION__, __LINE__); |
|
| 111 | 111 | return false; |
| 112 | 112 | } |
| 113 | 113 | return true; |
@@ -148,17 +148,17 @@ discard block |
||
| 148 | 148 | * @return string |
| 149 | 149 | * @throws \EE_Error |
| 150 | 150 | */ |
| 151 | - public function display( $event = null, $view_details = false ) |
|
| 151 | + public function display($event = null, $view_details = false) |
|
| 152 | 152 | { |
| 153 | 153 | // reset filter for displaying submit button |
| 154 | - remove_filter( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true' ); |
|
| 154 | + remove_filter('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', '__return_true'); |
|
| 155 | 155 | // poke and prod incoming event till it tells us what it is |
| 156 | - if ( ! $this->setEvent( $event ) ) { |
|
| 156 | + if ( ! $this->setEvent($event)) { |
|
| 157 | 157 | return false; |
| 158 | 158 | } |
| 159 | 159 | // begin gathering template arguments by getting event status |
| 160 | - $template_args = array( 'event_status' => $this->event->get_active_status() ); |
|
| 161 | - if ( $this->activeEventAndShowTicketSelector($event, $template_args['event_status'], $view_details) ) { |
|
| 160 | + $template_args = array('event_status' => $this->event->get_active_status()); |
|
| 161 | + if ($this->activeEventAndShowTicketSelector($event, $template_args['event_status'], $view_details)) { |
|
| 162 | 162 | return ! is_single() ? $this->displayViewDetailsButton() : ''; |
| 163 | 163 | } |
| 164 | 164 | // filter the maximum qty that can appear in the Ticket Selector qty dropdowns |
@@ -168,7 +168,7 @@ discard block |
||
| 168 | 168 | } |
| 169 | 169 | // is the event expired ? |
| 170 | 170 | $template_args['event_is_expired'] = $this->event->is_expired(); |
| 171 | - if ( $template_args[ 'event_is_expired' ] ) { |
|
| 171 | + if ($template_args['event_is_expired']) { |
|
| 172 | 172 | return $this->expiredEventMessage(); |
| 173 | 173 | } |
| 174 | 174 | // get all tickets for this event ordered by the datetime |
@@ -176,7 +176,7 @@ discard block |
||
| 176 | 176 | if (count($tickets) < 1) { |
| 177 | 177 | return $this->noTicketAvailableMessage(); |
| 178 | 178 | } |
| 179 | - if (\EED_Events_Archive::is_iframe()){ |
|
| 179 | + if (\EED_Events_Archive::is_iframe()) { |
|
| 180 | 180 | $this->setIframe(); |
| 181 | 181 | } |
| 182 | 182 | // redirecting to another site for registration ?? |
@@ -184,10 +184,10 @@ discard block |
||
| 184 | 184 | // if redirecting to another site for registration, then we don't load the TS |
| 185 | 185 | $ticket_selector = $external_url |
| 186 | 186 | ? $this->externalEventRegistration() |
| 187 | - : $this->loadTicketSelector($tickets,$template_args); |
|
| 187 | + : $this->loadTicketSelector($tickets, $template_args); |
|
| 188 | 188 | // now set up the form (but not for the admin) |
| 189 | 189 | $ticket_selector = ! is_admin() |
| 190 | - ? $this->formOpen($this->event->ID(), $external_url) . $ticket_selector |
|
| 190 | + ? $this->formOpen($this->event->ID(), $external_url).$ticket_selector |
|
| 191 | 191 | : $ticket_selector; |
| 192 | 192 | // submit button and form close tag |
| 193 | 193 | $ticket_selector .= ! is_admin() ? $this->displaySubmitButton($external_url) : ''; |
@@ -237,10 +237,10 @@ discard block |
||
| 237 | 237 | */ |
| 238 | 238 | protected function expiredEventMessage() |
| 239 | 239 | { |
| 240 | - return '<div class="ee-event-expired-notice"><span class="important-notice">' . esc_html__( |
|
| 240 | + return '<div class="ee-event-expired-notice"><span class="important-notice">'.esc_html__( |
|
| 241 | 241 | 'We\'re sorry, but all tickets sales have ended because the event is expired.', |
| 242 | 242 | 'event_espresso' |
| 243 | - ) . '</span></div>'; |
|
| 243 | + ).'</span></div>'; |
|
| 244 | 244 | } |
| 245 | 245 | |
| 246 | 246 | |
@@ -254,7 +254,7 @@ discard block |
||
| 254 | 254 | */ |
| 255 | 255 | protected function noTicketAvailableMessage() |
| 256 | 256 | { |
| 257 | - $no_ticket_available_msg = esc_html__( 'We\'re sorry, but all ticket sales have ended.', 'event_espresso' ); |
|
| 257 | + $no_ticket_available_msg = esc_html__('We\'re sorry, but all ticket sales have ended.', 'event_espresso'); |
|
| 258 | 258 | if (current_user_can('edit_post', $this->event->ID())) { |
| 259 | 259 | $no_ticket_available_msg .= sprintf( |
| 260 | 260 | esc_html__( |
@@ -269,7 +269,7 @@ discard block |
||
| 269 | 269 | } |
| 270 | 270 | return ' |
| 271 | 271 | <div class="ee-event-expired-notice"> |
| 272 | - <span class="important-notice">' . $no_ticket_available_msg . '</span> |
|
| 272 | + <span class="important-notice">' . $no_ticket_available_msg.'</span> |
|
| 273 | 273 | </div>'; |
| 274 | 274 | } |
| 275 | 275 | |
@@ -300,7 +300,7 @@ discard block |
||
| 300 | 300 | '</a></span></div>' |
| 301 | 301 | ); |
| 302 | 302 | } |
| 303 | - return '<p><span class="important-notice">' . $sales_closed_msg . '</span></p>'; |
|
| 303 | + return '<p><span class="important-notice">'.$sales_closed_msg.'</span></p>'; |
|
| 304 | 304 | } |
| 305 | 305 | |
| 306 | 306 | |
@@ -362,12 +362,12 @@ discard block |
||
| 362 | 362 | */ |
| 363 | 363 | $template_args['anchor_id'] = apply_filters( |
| 364 | 364 | 'FHEE__EE_Ticket_Selector__redirect_anchor_id', |
| 365 | - '#tkt-slctr-tbl-' . $this->event->ID(), |
|
| 365 | + '#tkt-slctr-tbl-'.$this->event->ID(), |
|
| 366 | 366 | $this->event->ID() |
| 367 | 367 | ); |
| 368 | 368 | $template_args['tickets'] = $tickets; |
| 369 | 369 | $template_args['ticket_count'] = count($tickets); |
| 370 | - $ticket_selector = $this->simpleTicketSelector( $tickets, $template_args); |
|
| 370 | + $ticket_selector = $this->simpleTicketSelector($tickets, $template_args); |
|
| 371 | 371 | return $ticket_selector instanceof TicketSelectorSimple |
| 372 | 372 | ? $ticket_selector |
| 373 | 373 | : new TicketSelectorStandard( |
@@ -448,11 +448,11 @@ discard block |
||
| 448 | 448 | * @param string $external_url |
| 449 | 449 | * @return string |
| 450 | 450 | */ |
| 451 | - public function formOpen( $ID = 0, $external_url = '' ) |
|
| 451 | + public function formOpen($ID = 0, $external_url = '') |
|
| 452 | 452 | { |
| 453 | 453 | // if redirecting, we don't need any anything else |
| 454 | - if ( $external_url ) { |
|
| 455 | - $html = '<form method="GET" action="' . \EEH_URL::refactor_url($external_url) . '"'; |
|
| 454 | + if ($external_url) { |
|
| 455 | + $html = '<form method="GET" action="'.\EEH_URL::refactor_url($external_url).'"'; |
|
| 456 | 456 | // open link in new window ? |
| 457 | 457 | $html .= apply_filters( |
| 458 | 458 | 'FHEE__EventEspresso_modules_ticket_selector_DisplayTicketSelector__formOpen__external_url_target_blank', |
@@ -461,21 +461,21 @@ discard block |
||
| 461 | 461 | ? ' target="_blank"' |
| 462 | 462 | : ''; |
| 463 | 463 | $html .= '>'; |
| 464 | - $query_args = \EEH_URL::get_query_string( $external_url ); |
|
| 465 | - foreach ( (array)$query_args as $query_arg => $value ) { |
|
| 466 | - $html .= '<input type="hidden" name="' . $query_arg . '" value="' . $value . '">'; |
|
| 464 | + $query_args = \EEH_URL::get_query_string($external_url); |
|
| 465 | + foreach ((array) $query_args as $query_arg => $value) { |
|
| 466 | + $html .= '<input type="hidden" name="'.$query_arg.'" value="'.$value.'">'; |
|
| 467 | 467 | } |
| 468 | 468 | return $html; |
| 469 | 469 | } |
| 470 | 470 | // if there is no submit button, then don't start building a form |
| 471 | 471 | // because the "View Details" button will build its own form |
| 472 | - if ( ! apply_filters( 'FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false ) ) { |
|
| 472 | + if ( ! apply_filters('FHEE__EE_Ticket_Selector__display_ticket_selector_submit', false)) { |
|
| 473 | 473 | return ''; |
| 474 | 474 | } |
| 475 | - $checkout_url = \EEH_Event_View::event_link_url( $ID ); |
|
| 476 | - if ( ! $checkout_url ) { |
|
| 475 | + $checkout_url = \EEH_Event_View::event_link_url($ID); |
|
| 476 | + if ( ! $checkout_url) { |
|
| 477 | 477 | \EE_Error::add_error( |
| 478 | - esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 478 | + esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
| 479 | 479 | __FILE__, |
| 480 | 480 | __FUNCTION__, |
| 481 | 481 | __LINE__ |
@@ -484,10 +484,10 @@ discard block |
||
| 484 | 484 | // set no cache headers and constants |
| 485 | 485 | \EE_System::do_not_cache(); |
| 486 | 486 | $extra_params = $this->iframe ? ' target="_blank"' : ''; |
| 487 | - $html = '<form method="POST" action="' . $checkout_url . '"' . $extra_params . '>'; |
|
| 488 | - $html .= wp_nonce_field( 'process_ticket_selections', 'process_ticket_selections_nonce_' . $ID, true, false ); |
|
| 487 | + $html = '<form method="POST" action="'.$checkout_url.'"'.$extra_params.'>'; |
|
| 488 | + $html .= wp_nonce_field('process_ticket_selections', 'process_ticket_selections_nonce_'.$ID, true, false); |
|
| 489 | 489 | $html .= '<input type="hidden" name="ee" value="process_ticket_selections">'; |
| 490 | - $html = apply_filters( 'FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event ); |
|
| 490 | + $html = apply_filters('FHEE__EE_Ticket_Selector__ticket_selector_form_open__html', $html, $this->event); |
|
| 491 | 491 | return $html; |
| 492 | 492 | } |
| 493 | 493 | |
@@ -510,7 +510,7 @@ discard block |
||
| 510 | 510 | $html .= empty($external_url) |
| 511 | 511 | ? $this->ticketSelectorEndDiv() |
| 512 | 512 | : $this->clearTicketSelector(); |
| 513 | - $html .= '<br/>' . $this->formClose(); |
|
| 513 | + $html .= '<br/>'.$this->formClose(); |
|
| 514 | 514 | } else if ($this->getMaxAttendees() === 1) { |
| 515 | 515 | // its a "Dude Where's my Ticket Selector?" (DWMTS) type event (ie: $_max_atndz === 1) |
| 516 | 516 | if ($this->event->is_sold_out()) { |
@@ -588,12 +588,12 @@ discard block |
||
| 588 | 588 | ); |
| 589 | 589 | $external_url = $this->event->external_url(); |
| 590 | 590 | $html = \EEH_HTML::div( |
| 591 | - '', 'ticket-selector-submit-' . $this->event->ID() . '-btn-wrap', 'ticket-selector-submit-btn-wrap' |
|
| 591 | + '', 'ticket-selector-submit-'.$this->event->ID().'-btn-wrap', 'ticket-selector-submit-btn-wrap' |
|
| 592 | 592 | ); |
| 593 | - $html .= '<input id="ticket-selector-submit-' . $this->event->ID() . '-btn"'; |
|
| 593 | + $html .= '<input id="ticket-selector-submit-'.$this->event->ID().'-btn"'; |
|
| 594 | 594 | $html .= ' class="ticket-selector-submit-btn '; |
| 595 | 595 | $html .= empty($external_url) ? 'ticket-selector-submit-ajax"' : '"'; |
| 596 | - $html .= ' type="submit" value="' . $btn_text . '" />'; |
|
| 596 | + $html .= ' type="submit" value="'.$btn_text.'" />'; |
|
| 597 | 597 | $html .= \EEH_HTML::divx(); |
| 598 | 598 | $html .= apply_filters( |
| 599 | 599 | 'FHEE__EE_Ticket_Selector__after_ticket_selector_submit', |
@@ -614,11 +614,11 @@ discard block |
||
| 614 | 614 | * @return string |
| 615 | 615 | * @throws \EE_Error |
| 616 | 616 | */ |
| 617 | - public function displayViewDetailsButton( $DWMTS = false ) |
|
| 617 | + public function displayViewDetailsButton($DWMTS = false) |
|
| 618 | 618 | { |
| 619 | - if ( ! $this->event->get_permalink() ) { |
|
| 619 | + if ( ! $this->event->get_permalink()) { |
|
| 620 | 620 | \EE_Error::add_error( |
| 621 | - esc_html__( 'The URL for the Event Details page could not be retrieved.', 'event_espresso' ), |
|
| 621 | + esc_html__('The URL for the Event Details page could not be retrieved.', 'event_espresso'), |
|
| 622 | 622 | __FILE__, __FUNCTION__, __LINE__ |
| 623 | 623 | ); |
| 624 | 624 | } |
@@ -636,7 +636,7 @@ discard block |
||
| 636 | 636 | ) |
| 637 | 637 | ? ' target="_blank"' |
| 638 | 638 | : ''; |
| 639 | - $view_details_btn .='>'; |
|
| 639 | + $view_details_btn .= '>'; |
|
| 640 | 640 | $btn_text = apply_filters( |
| 641 | 641 | 'FHEE__EE_Ticket_Selector__display_view_details_btn__btn_text', |
| 642 | 642 | esc_html__('View Details', 'event_espresso'), |
@@ -647,7 +647,7 @@ discard block |
||
| 647 | 647 | . '-btn" class="ticket-selector-submit-btn view-details-btn" type="submit" value="' |
| 648 | 648 | . $btn_text |
| 649 | 649 | . '" />'; |
| 650 | - $view_details_btn .= apply_filters( 'FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event ); |
|
| 650 | + $view_details_btn .= apply_filters('FHEE__EE_Ticket_Selector__after_view_details_btn', '', $this->event); |
|
| 651 | 651 | if ($DWMTS) { |
| 652 | 652 | $view_details_btn .= $this->formClose(); |
| 653 | 653 | $view_details_btn .= $this->ticketSelectorEndDiv(); |