• Sign in to follow this  
    Followers 0

    Добавление полей в модуль Сотрудники в SuiteCRM


    SpravkaCRM.ru

    Суть в следующем: Стояла задача добавить несколько полей в модуль Сотрудники. Поля добавил, вывел их в макете редактирования и отображения. Но вводимые значения не сохранялись. То есть переходишь в режим редактирования карточки Сотрудника, указываешь значения, нажимаешь кнопку "Сохранить". Карточка сохраняется, но новые указанные значения не применяются. Остаются не заполненнями. В результате, как выяснилось, в модуле Сотрудники есть файл Save.php, который собой перехватывает стандартный процесс выполнения сохранения, и задает свой режим этого действа. Вот в этом файле надо было новые поля прописать в массиве разрешенных к сохранению полей. Сделано видимо это было в силу того, что модуль Сотрудники использует ту же самую таблицу, что и доступный только Админам модуль Пользователи. И чтобы рядовые сотрудники, имеющие доступ на запись к модулю Сотрудники, но не имеющие доступ к модулю Пользователи, не насохраняли там чего им сохранять нельзя, сделано было такое ограничение: к изменению принимаются только жестко заданный набор переменных.

    Ну а теперь по порядку что и как делал:

    Нужно было добавить 3 поля, характеризующих зарплату сотрудника:

    • Тип зарплатных отношений (тут выпадающий список с единственным значением "Фиксированная ставка в зависимости от выработанных часов"
    • Кол-во часов в день
    • Стоимость месяца

    Таким образом можно было указать за какое количество отработанных часов тот или иной сотрудник получит определенную сумму денег.

    Выпадающий список с типом отношений добавил в файл с выпадающими списками custom/include/language/ru_ru.lang.php:

    $GLOBALS['app_list_strings']['employee_cost_type_list'] = array(
        '' => '',
        'fix_time' => 'Фиксированная ставка в зависимости от выработанных часов',
    );

    3 новых поля добавил в файл custom/Extension/modules/Users/Ext/Vardefs/employee_payment.php Да, именно в модуле Users, а не Employee. У модулей есть такая вот специфика в силу того, что модуль Employee некоторым образом зависит от модуля User. Если такого файла нет, надо его создать:

     

    /**
     * Created by PhpStorm.
     * User: evgen
     * Date: 19.12.15
     * Time: 12:56
     */
    $dictionary["User"]["fields"]["cost_type"] = array(
        'required' => false,
        'name' => 'cost_type',
        'vname' => 'LBL_COST_TYPE',
        'type' => 'enum',
        'massupdate' => 0,
        'no_default' => false,
        'comments' => '',
        'help' => '',
        'importable' => 'true',
        'duplicate_merge' => 'disabled',
        'duplicate_merge_dom_value' => '0',
        'audited' => true,
        'inline_edit' => '',
        'reportable' => true,
        'unified_search' => false,
        'merge_filter' => 'disabled',
        'len' => 100,
        'size' => '20',
        'options' => 'employee_cost_type_list',
        'studio' => 'visible',
        'dependency' => false,
    );
    $dictionary["User"]["fields"]["fix_time_day_count"] = array(
        'required' => false,
        'name' => 'fix_time_day_count',
        'vname' => 'LBL_FIX_TIME_DAY_COUNT',
        'type' => 'varchar',
        'massupdate' => 0,
        'no_default' => false,
        'comments' => '',
        'help' => '',
        'importable' => 'true',
        'duplicate_merge' => 'disabled',
        'duplicate_merge_dom_value' => '0',
        'audited' => true,
        'inline_edit' => '',
        'reportable' => true,
        'unified_search' => false,
        'merge_filter' => 'disabled',
        'len' => '4',
        'size' => '20',
    );
    $dictionary["User"]["fields"]["fix_time_day_count_month_cost"] = array(
        'required' => false,
        'name' => 'fix_time_day_count_month_cost',
        'vname' => 'LBL_FIX_TIME_DAY_COUNT_MONTH_COST',
        'type' => 'currency',
        'massupdate' => 0,
        'no_default' => false,
        'comments' => '',
        'help' => '',
        'importable' => 'true',
        'duplicate_merge' => 'disabled',
        'duplicate_merge_dom_value' => '0',
        'audited' => true,
        'inline_edit' => '',
        'reportable' => true,
        'unified_search' => false,
        'merge_filter' => 'disabled',
        'len' => 26,
        'size' => '20',
        'enable_range_search' => false,
        'precision' => 6,
    );

    Лейблы LBL_COST_TYPE, LBL_FIX_TIME_DAY_COUNT и LBL_FIX_TIME_DAY_COUNT_MONTH_COST описал в файле custom/Extension/modules/Employees/Ext/Language/ru_ru.employee_payment.php также предварительно его создав:

    
    $mod_strings = array_merge($mod_strings,
       array(
           'LBL_COST_TYPE' => "Тип оплаты",
           'LBL_FIX_TIME_DAY_COUNT' => "Кол-во часов в день",
           'LBL_FIX_TIME_DAY_COUNT_MONTH_COST' => "Стоимость месяца",
       )
    );
    ?>
    

    А также добавил 3 новых свойства в объект Employee в файле modules/Employees/Employee.php

    // Employee is used to store customer information.
    class Employee extends Person {
       // Stored fields
       var $name = '';
       var $id;
       var $is_admin;
       var $first_name;
       var $last_name;
       var $full_name;
       var $user_name;
       var $title;
       var $description;
       var $department;
       var $reports_to_id;
       var $reports_to_name;
       var $phone_home;
       var $phone_mobile;
       var $phone_work;
       var $phone_other;
       var $phone_fax;
       var $email1;
       var $email2;
       var $address_street;
       var $address_city;
       var $address_state;
       var $address_postalcode;
       var $address_country;
       var $date_entered;
       var $date_modified;
       var $modified_user_id;
       var $created_by;
       var $created_by_name;
       var $modified_by_name;
       var $status;
       var $messenger_id;
       var $messenger_type;
       var $employee_status;
       var $error_string;
        public $person_id;
    
       var $module_dir = "Employees";
    
    
       var $table_name = "users";
    
       var $object_name = "Employee";
       var $user_preferences;
    
       var $encodeFields = Array("first_name", "last_name", "description");
    
       // This is used to retrieve related fields from form posts.
       var $additional_column_fields = Array('reports_to_name');
    
    
    
       var $new_schema = true;
    
       // Custom fields
       var $cost_type;
       var $fix_time_day_count;
       var $fix_time_day_count_month_cost;

    Теперь надо обновить базу данных, чтобы в таблице `users` появилось наши новые 3 поля. Для этого переходим в Администрирование -> Восстановление -> Быстрое восстановление:

    567550243d15f_2015-12-1915-39-35CRMHosti

    После этого SuiteCRM проверит структуру базы данных, сравнит ее с конфигурационными настройками, указанными в SuiteCRM, и, если найдет расхождения, выдаст список SQL-запрос на устранение этих расхождений. В нашем случае это будет SQL-запрос на добавление 3-х полей в таблицу `users`:

    5675515edc165_2015-12-1915-45-04CRMHosti

    Нажимаем кнопку "Выполнить". После этого SQL-запросы выполняются, и у таблицы `users` появляются 3 наших поля.

    Далее в студии добавляем поля в макеты редактирования и детального просмотра. Я эти три поля вынес в отдельный таб "Зарплата":

    5675520c333b8_2015-12-1915-47-50CRMHosti

     

    И вот что мы теперь видим при переходе в редактирвание сотрудника:

    5675524a46a6a_2015-12-1915-49-05CRMHosti

    Нам осталось добавить эти 3 поля в список полей, которые разрешено править в модуле Сотрудники. Для этого переходим в файл /modules/Employees/Save.php, и ищем там такой блок:

    //only employee specific field values need to be copied.
    $e_fields=array('first_name','last_name','reports_to_id','description','phone_home','phone_mobile','phone_work','phone_other','phone_fax','address_street','address_city','address_state','address_country','address_country', 'address_postalcode', 'messenger_id','messenger_type');
    

    И прям под ним добавляем такую строку:

    $e_fields = array_merge($e_fields, ['cost_type','fix_time_day_count','fix_time_day_count_month_cost']);

    тем самым мы расширили массив e_fields новыми значениями с нашими полями.

    Теперь мы можем сохранять значения в полях, и как то дальше с ними работать:

    567552f93bc3e_2015-12-1915-51-59CRMHosti


    1 person likes this
    Sign in to follow this  
    Followers 0


    User Feedback


    Delphin

    Posted

    У меня есть задача на форме редактирования "Предварительных контактов" запретить редактирование Рабочего телефона. Но как это сделать не могу додумать.. Не подскажите в какую сторону копать? 

    Share this comment


    Link to comment
    Share on other sites


    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!


    Register a new account

    Sign in

    Already have an account? Sign in here.


    Sign In Now