FluentCrmApi('contacts') to get the class instance * * @package FluentCrm\App\Api\Classes * @namespace FluentCrm\App\Api\Classes * * @version 1.0.0 */ class Contacts { private $instance = null; private $allowedInstanceMethods = [ 'all', 'get', 'find', 'first', 'paginate' ]; public function __construct(Subscriber $instance) { $this->instance = $instance; } /** * Get Contact by contact id or email * * Use: * FluentCrmApi('contacts')->getContact($idOrEmail); * * @param int|string $idOrEmail Contact ID or Email * @return false|Subscriber Model of the subscriber */ public function getContact($idOrEmail) { if (is_numeric($idOrEmail)) { return Subscriber::where('id', $idOrEmail)->first(); } else if (is_string($idOrEmail)) { return Subscriber::where('email', $idOrEmail)->first(); } return false; } /** * Get Contact by user id or Email * * Use: * FluentCrmApi('contacts')->getContactByUserRef($userIdOrEmail); * * @param int|string $userIdOrEmail User ID or Email * @return false|Subscriber Model of the subscriber */ public function getContactByUserRef($userIdOrEmail) { $userIdFallback = false; if (is_numeric($userIdOrEmail)) { $subscriber = Subscriber::where('user_id', $userIdOrEmail)->first(); if ($subscriber) { return $subscriber; } $user = get_user_by('ID', $userIdOrEmail); if (!$user) { return false; } $userIdFallback = $user->ID; $userIdOrEmail = $user->user_email; } $contact = false; if (is_string($userIdOrEmail)) { $contact = Subscriber::where('email', $userIdOrEmail)->first(); if ($contact && $userIdFallback) { $contact->user_id = $userIdFallback; $contact->save(); } } return $contact; } /** * Get Contact by contact id * * @param int $userId User ID * @return false|Subscriber Model of the subscriber */ public function getContactByUserId($userId) { return Subscriber::where('user_id', $userId)->first(); } /** * Create or Update Contact * * Usage: * * FluentCrmApi('contacts')->createOrUpdateContact($data, $forceUpdate, $deleteOtherValues, $sync); * * @param array $data contact data to add or update * @param bool $forceUpdate if true, will update the contact status forcefully * @param bool $deleteOtherValues if true, will delete all custom fields data and add the new one * @param bool $sync no use case yet * @return false|Subscriber */ public function createOrUpdate($data, $forceUpdate = false, $deleteOtherValues = false, $sync = false) { if (empty($data['email']) || !is_email($data['email'])) { return false; } if (!$forceUpdate) { $exist = Subscriber::where('email', $data['email'])->first(); if ($exist && $exist->status != 'subscribed' && !empty($data['status'])) { $forceUpdate = true; } } if (!isset($data['custom_values'])) { $customFieldKeys = []; $customFields = (new CustomContactField)->getGlobalFields()['fields']; foreach ($customFields as $field) { $customFieldKeys[] = $field['slug']; } if ($customFieldKeys) { $customFieldsData = Arr::only($data, $customFieldKeys); $customFieldsData = array_filter($customFieldsData); if ($customFields) { $data['custom_values'] = (new CustomContactField)->formatCustomFieldValues($customFieldsData); } } } return $this->instance->updateOrCreate($data, $forceUpdate, $deleteOtherValues, $sync); } /** * Get The current logged in contact * * Use *
FluentCrmApi('contacts')->getCurrentContact()
* * @return false|Subscriber */ public function getCurrentContact($cached = true, $useSecureCookie = false) { static $currentContact; if ($cached && $currentContact) { return $currentContact; } $userId = get_current_user_id(); if ($userId) { $user = get_user_by('ID', $userId); $currentContact = $this->instance->where('user_id', $user->ID)->orWhere('email', $user->user_email)->first(); } if (!$currentContact && $useSecureCookie) { $currentContact = $this->getContactBySecureHash(\FluentCrm\Framework\Support\Arr::get($_COOKIE, 'fc_hash_secure')); } return $currentContact; } public function getContactBySecureHash($hash) { if (!$hash) { return null; } $secureMeta = SubscriberMeta::where('value', $hash)->where('key', '_secure_hash') ->first(); if ($secureMeta) { return $this->instance->where('id', $secureMeta->subscriber_id)->first(); } return null; } public function getContactByManagedSecureHash($hash) { if (!$hash) { return null; } $secureMeta = SubscriberMeta::where('value', $hash)->where('key', '_secure_managed_hash') ->first(); if ($secureMeta) { return $this->instance->where('id', $secureMeta->subscriber_id)->first(); } return null; } /** * To Contact's Advanced Query Class * Use *
FluentCrmApi('contacts')->query($args)
* @param $args array * @return \FluentCrm\App\Services\ContactsQuery */ public function query($args) { return new ContactsQuery($args); } /** * @return \FluentCrm\App\Models\Subscriber */ public function getInstance() { return $this->instance; } public function getCustomFields($types = [], $byOptions = false) { $customFields = fluentcrm_get_custom_contact_fields(); if ($types) { $customFields = array_filter($customFields, function ($field) use ($types) { return in_array($field['type'], $types); }); } if ($byOptions) { $formatted = []; foreach ($customFields as $field) { $formatted[] = [ 'id' => $field['slug'], 'title' => $field['label'] ]; } return $formatted; } return $customFields; } public function __call($method, $params) { if (in_array($method, $this->allowedInstanceMethods)) { return call_user_func_array([$this->instance, $method], $params); } /* translators: %s: method name */ throw new \Exception(sprintf('Method %s does not exist.', esc_html($method))); } }