Initial commit
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
<?php
|
||||
|
||||
namespace FluentCrm\App\Models;
|
||||
|
||||
use FluentCrm\Framework\Support\Arr;
|
||||
|
||||
/**
|
||||
* CustomContactField Model - DB Model for Custom Contact Fields
|
||||
*
|
||||
* Database Model
|
||||
*
|
||||
* @package FluentCrm\App\Models
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
class CustomContactField
|
||||
{
|
||||
protected $globalMetaName = 'contact_custom_fields';
|
||||
|
||||
public function getGlobalFields($with = [])
|
||||
{
|
||||
$data['fields'] = fluentcrm_get_option($this->globalMetaName, []);
|
||||
|
||||
if (in_array('field_types', $with)) {
|
||||
$data['field_types'] = $this->getFieldTypes();
|
||||
}
|
||||
|
||||
if (in_array('field_groups', $with)) {
|
||||
$data['field_groups'] = $this->getFieldGroups();
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function getFieldTypes()
|
||||
{
|
||||
/**
|
||||
* Modify the global custom contact field types for FluentCRM custom contact fields.
|
||||
*
|
||||
* The default field types are: 'text', 'textarea', 'number', 'single-select', 'multi-select', 'radio', 'checkbox', 'date', 'date_time'.
|
||||
*
|
||||
* @since 2.7.0
|
||||
*
|
||||
* @param array {
|
||||
* An associative array of field types.
|
||||
*
|
||||
* @type array $text {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $textarea {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $number {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $single-select {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $multi-select {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $radio {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $checkbox {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $date {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* @type array $date_time {
|
||||
* @type string $type The type of the field.
|
||||
* @type string $label The label for the field.
|
||||
* @type string $value_type The value type of the field.
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
return apply_filters('fluent_crm/global_field_types', [
|
||||
'text' => [
|
||||
'type' => 'text',
|
||||
'label' => __('Single Line Text', 'fluent-crm'),
|
||||
'value_type' => 'string'
|
||||
],
|
||||
'textarea' => [
|
||||
'type' => 'textarea',
|
||||
'label' => __('Multi Line Text', 'fluent-crm'),
|
||||
'value_type' => 'string'
|
||||
],
|
||||
'number' => [
|
||||
'type' => 'number',
|
||||
'label' => __('Numeric Field', 'fluent-crm'),
|
||||
'value_type' => 'numeric'
|
||||
],
|
||||
'single-select' => [
|
||||
'type' => 'select-one',
|
||||
'label' => __('Select choice', 'fluent-crm'),
|
||||
'value_type' => 'string'
|
||||
],
|
||||
'multi-select' => [
|
||||
'type' => 'select-multi',
|
||||
'label' => __('Multiple Select choice', 'fluent-crm'),
|
||||
'value_type' => 'array'
|
||||
],
|
||||
'radio' => [
|
||||
'type' => 'radio',
|
||||
'label' => __('Radio Choice', 'fluent-crm'),
|
||||
'value_type' => 'string'
|
||||
],
|
||||
'checkbox' => [
|
||||
'type' => 'checkbox',
|
||||
'label' => __('Checkboxes', 'fluent-crm'),
|
||||
'value_type' => 'array'
|
||||
],
|
||||
'date' => [
|
||||
'type' => 'date',
|
||||
'label' => __('Date', 'fluent-crm'),
|
||||
'value_type' => 'date'
|
||||
],
|
||||
'date_time' => [
|
||||
'type' => 'date_time',
|
||||
'label' => __('Date and Time', 'fluent-crm'),
|
||||
'value_type' => 'datetime'
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function saveGlobalFields($fields)
|
||||
{
|
||||
$slugs = [];
|
||||
|
||||
foreach ($fields as $field) {
|
||||
if (isset($field['slug'])) {
|
||||
$slugs[] = $field['slug'];
|
||||
}
|
||||
}
|
||||
|
||||
$formattedFields = [];
|
||||
|
||||
$keys = [];
|
||||
foreach ($fields as $field) {
|
||||
|
||||
if (empty($field['slug'])) {
|
||||
$field['slug'] = $this->generateSlug($field, $slugs);
|
||||
}
|
||||
|
||||
if (in_array($field['slug'], $keys)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$keys[] = $field['slug'];
|
||||
|
||||
$formattedFields[] = $field;
|
||||
}
|
||||
|
||||
fluentcrm_update_option($this->globalMetaName, $formattedFields);
|
||||
|
||||
return $formattedFields;
|
||||
}
|
||||
|
||||
protected function generateSlug($field, $slugs)
|
||||
{
|
||||
$label = str_replace(' ', '_', $field['label']);
|
||||
$label = sanitize_title($label, 'custom_field', 'view');
|
||||
$label = substr($label, 0, 25);
|
||||
$originalLabel = $label;
|
||||
|
||||
if (is_numeric($label)) {
|
||||
$label = 'cf_' . $label;
|
||||
}
|
||||
|
||||
$mainColumns = array_merge(
|
||||
(new Subscriber)->getFillable(),
|
||||
['id', 'updated_at']
|
||||
);
|
||||
|
||||
if (in_array($label, $mainColumns)) {
|
||||
$label = 'cf_' . $label;
|
||||
}
|
||||
|
||||
$index = 1;
|
||||
|
||||
while (in_array($label, $slugs)) {
|
||||
$label = $originalLabel . '_' . $index;
|
||||
$index++;
|
||||
}
|
||||
|
||||
return $label;
|
||||
}
|
||||
|
||||
public function formatCustomFieldValues($values, $fields = [])
|
||||
{
|
||||
if (!$values) {
|
||||
return $values;
|
||||
}
|
||||
if (!$fields) {
|
||||
$rawFields = fluentcrm_get_option($this->globalMetaName, []);
|
||||
foreach ($rawFields as $field) {
|
||||
$fields[$field['slug']] = $field;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($values as $valueKey => $value) {
|
||||
|
||||
$isArrayType = Arr::get($fields, $valueKey . '.type') == 'checkbox' || Arr::get($fields, $valueKey . '.type') == 'select-multi';
|
||||
|
||||
if (!is_array($value) && $isArrayType) {
|
||||
$itemValues = explode(',', $value);
|
||||
$trimmedvalues = [];
|
||||
foreach ($itemValues as $itemValue) {
|
||||
$trimmedvalues[] = trim($itemValue);
|
||||
}
|
||||
if ($itemValue) {
|
||||
$values[$valueKey] = $trimmedvalues;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $values;
|
||||
}
|
||||
|
||||
public function getFieldGroups()
|
||||
{
|
||||
$fieldGroups = fluentcrm_get_option('contact_field_groups');
|
||||
|
||||
if (!$fieldGroups) {
|
||||
$fieldGroups = [
|
||||
[
|
||||
'slug' => 'default',
|
||||
'title' => __('Custom Profile Data', 'fluent-crm')
|
||||
]
|
||||
];
|
||||
}
|
||||
return $fieldGroups;
|
||||
}
|
||||
|
||||
public function updateGroupName($oldName, $newName)
|
||||
{
|
||||
$currentCustomFields = fluentcrm_get_option($this->globalMetaName);
|
||||
|
||||
$updatedCustomFields = [];
|
||||
|
||||
foreach ($currentCustomFields as $customField) {
|
||||
if (isset($customField['group']) && $customField['group'] == $oldName) {
|
||||
$customField['group'] = $newName;
|
||||
}
|
||||
$updatedCustomFields[] = $customField;
|
||||
}
|
||||
|
||||
fluentcrm_update_option($this->globalMetaName, $updatedCustomFields);
|
||||
|
||||
return $updatedCustomFields;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user