330 lines
7.7 KiB
PHP
330 lines
7.7 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Class CRM_Event_Cart_BAO_EventInCart
|
||
|
*/
|
||
|
class CRM_Event_Cart_BAO_EventInCart extends CRM_Event_Cart_DAO_EventInCart implements ArrayAccess {
|
||
|
public $assocations_loaded = FALSE;
|
||
|
public $event;
|
||
|
public $event_cart;
|
||
|
public $location = NULL;
|
||
|
public $participants = array();
|
||
|
|
||
|
/**
|
||
|
* Class constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
parent::__construct();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add participant to cart.
|
||
|
*
|
||
|
* @param $participant
|
||
|
*/
|
||
|
public function add_participant($participant) {
|
||
|
$this->participants[$participant->id] = $participant;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return object $this|CRM_Event_Cart_BAO_EventInCart
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public static function create(&$params) {
|
||
|
$transaction = new CRM_Core_Transaction();
|
||
|
$event_in_cart = new CRM_Event_Cart_BAO_EventInCart();
|
||
|
$event_in_cart->copyValues($params);
|
||
|
$event_in_cart = $event_in_cart->save();
|
||
|
|
||
|
if (is_a($event_in_cart, 'CRM_Core_Error')) {
|
||
|
$transaction->rollback();
|
||
|
CRM_Core_Error::fatal(ts('There was an error creating an event_in_cart'));
|
||
|
}
|
||
|
|
||
|
$transaction->commit();
|
||
|
|
||
|
return $event_in_cart;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param bool $useWhere
|
||
|
*
|
||
|
* @return mixed|void
|
||
|
*/
|
||
|
public function delete($useWhere = FALSE) {
|
||
|
$this->load_associations();
|
||
|
$contacts_to_delete = array();
|
||
|
foreach ($this->participants as $participant) {
|
||
|
$defaults = array();
|
||
|
$params = array('id' => $participant->contact_id);
|
||
|
$temporary_contact = CRM_Contact_BAO_Contact::retrieve($params, $defaults);
|
||
|
|
||
|
if ($temporary_contact->is_deleted) {
|
||
|
$contacts_to_delete[$temporary_contact->id] = 1;
|
||
|
}
|
||
|
$participant->delete();
|
||
|
}
|
||
|
foreach (array_keys($contacts_to_delete) as $contact_id) {
|
||
|
CRM_Contact_BAO_Contact::deleteContact($contact_id);
|
||
|
}
|
||
|
return parent::delete();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_cart_id
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function find_all_by_event_cart_id($event_cart_id) {
|
||
|
return self::find_all_by_params(array('event_cart_id' => $event_cart_id));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function find_all_by_params($params) {
|
||
|
$event_in_cart = new CRM_Event_Cart_BAO_EventInCart();
|
||
|
$event_in_cart->copyValues($params);
|
||
|
$result = array();
|
||
|
if ($event_in_cart->find()) {
|
||
|
while ($event_in_cart->fetch()) {
|
||
|
$result[$event_in_cart->event_id] = clone($event_in_cart);
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $id
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_EventInCart
|
||
|
*/
|
||
|
public static function find_by_id($id) {
|
||
|
return self::find_by_params(array('id' => $id));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $params
|
||
|
*
|
||
|
* @return bool|CRM_Event_Cart_BAO_EventInCart
|
||
|
*/
|
||
|
public static function find_by_params($params) {
|
||
|
$event_in_cart = new CRM_Event_Cart_BAO_EventInCart();
|
||
|
$event_in_cart->copyValues($params);
|
||
|
if ($event_in_cart->find(TRUE)) {
|
||
|
return $event_in_cart;
|
||
|
}
|
||
|
else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $contact_id
|
||
|
*/
|
||
|
public function remove_participant_by_contact_id($contact_id) {
|
||
|
$to_remove = array();
|
||
|
foreach ($this->participants as $participant) {
|
||
|
if ($participant->contact_id == $contact_id) {
|
||
|
$to_remove[$participant->id] = 1;
|
||
|
$participant->delete();
|
||
|
}
|
||
|
}
|
||
|
$this->participants = array_diff_key($this->participants, $to_remove);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $participant_id
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function get_participant_by_id($participant_id) {
|
||
|
return $this->participants[$participant_id];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $participant_id
|
||
|
*/
|
||
|
public function remove_participant_by_id($participant_id) {
|
||
|
$this->get_participant_by_id($participant_id)->delete();
|
||
|
unset($this->participants[$participant_id]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $participant
|
||
|
*
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public static function part_key($participant) {
|
||
|
return $participant->id;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param null $event_cart
|
||
|
*/
|
||
|
public function load_associations($event_cart = NULL) {
|
||
|
if ($this->assocations_loaded) {
|
||
|
return;
|
||
|
}
|
||
|
$this->assocations_loaded = TRUE;
|
||
|
$params = array('id' => $this->event_id);
|
||
|
$defaults = array();
|
||
|
$this->event = CRM_Event_BAO_Event::retrieve($params, $defaults);
|
||
|
|
||
|
if ($event_cart != NULL) {
|
||
|
$this->event_cart = $event_cart;
|
||
|
$this->event_cart_id = $event_cart->id;
|
||
|
}
|
||
|
else {
|
||
|
$this->event_cart = CRM_Event_Cart_BAO_Cart::find_by_id($this->event_cart_id);
|
||
|
}
|
||
|
|
||
|
$participants = CRM_Event_Cart_BAO_MerParticipant::find_all_by_event_and_cart_id($this->event_id, $this->event_cart->id);
|
||
|
foreach ($participants as $participant) {
|
||
|
$participant->load_associations();
|
||
|
$this->add_participant($participant);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function load_location() {
|
||
|
if ($this->location == NULL) {
|
||
|
$location_params = array('entity_id' => $this->event_id, 'entity_table' => 'civicrm_event');
|
||
|
$this->location = CRM_Core_BAO_Location::getValues($location_params, TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function not_waiting_participants() {
|
||
|
$result = array();
|
||
|
foreach ($this->participants as $participant) {
|
||
|
if (!$participant->must_wait) {
|
||
|
$result[] = $participant;
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return int
|
||
|
*/
|
||
|
public function num_not_waiting_participants() {
|
||
|
return count($this->not_waiting_participants());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return int
|
||
|
*/
|
||
|
public function num_waiting_participants() {
|
||
|
return count($this->waiting_participants());
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param mixed $offset
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function offsetExists($offset) {
|
||
|
return array_key_exists(array_merge($this->fields(), array('main_conference_event_id')), $offset);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param mixed $offset
|
||
|
*
|
||
|
* @return int
|
||
|
*/
|
||
|
public function offsetGet($offset) {
|
||
|
if ($offset == 'event') {
|
||
|
return $this->event->toArray();
|
||
|
}
|
||
|
if ($offset == 'id') {
|
||
|
return $this->id;
|
||
|
}
|
||
|
if ($offset == 'main_conference_event_id') {
|
||
|
return $this->main_conference_event_id;
|
||
|
}
|
||
|
$fields = &$this->fields();
|
||
|
return $fields[$offset];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param mixed $offset
|
||
|
* @param mixed $value
|
||
|
*/
|
||
|
public function offsetSet($offset, $value) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param mixed $offset
|
||
|
*/
|
||
|
public function offsetUnset($offset) {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function waiting_participants() {
|
||
|
$result = array();
|
||
|
foreach ($this->participants as $participant) {
|
||
|
if ($participant->must_wait) {
|
||
|
$result[] = $participant;
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $event_id
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public static function get_registration_link($event_id) {
|
||
|
$cart = CRM_Event_Cart_BAO_Cart::find_or_create_for_current_session();
|
||
|
$cart->load_associations();
|
||
|
$event_in_cart = $cart->get_event_in_cart_by_event_id($event_id);
|
||
|
|
||
|
if ($event_in_cart) {
|
||
|
return array(
|
||
|
'label' => ts("Remove from Cart"),
|
||
|
'path' => 'civicrm/event/remove_from_cart',
|
||
|
'query' => "reset=1&id={$event_id}",
|
||
|
);
|
||
|
}
|
||
|
else {
|
||
|
return array(
|
||
|
'label' => ts("Add to Cart"),
|
||
|
'path' => 'civicrm/event/add_to_cart',
|
||
|
'query' => "reset=1&id={$event_id}",
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function is_parent_event() {
|
||
|
return (NULL !== (CRM_Event_BAO_Event::get_sub_events($this->event_id)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param int $parent_event_id
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function is_child_event($parent_event_id = NULL) {
|
||
|
if ($parent_event_id == NULL) {
|
||
|
return $this->event->parent_event_id;
|
||
|
}
|
||
|
else {
|
||
|
return $this->event->parent_event_id == $parent_event_id;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|