Приложение Контакты. Создание дополнительных полей при установке плагина. Есть решение

Есть необходимость содать при установке плагина дополнительные поля для Клиента.

Каких-то методов фреймворка я не нашел.

Нашел информацию, что надо дописывать в файлы: person_fields_order.php и custom_fields.php.

Использовал код:


// Person field order
$file = wa()->getConfig()->getConfigPath('person_fields_order.php', true, 'contacts');
if (!is_readable($file)) {
    $file = wa()->getConfig()->getPath('system', 'contact/data/person_fields_default');
}

copy($file, $file . '.orig');

$contactOrder = include($file);

if (!array_key_exists('field1', $contactOrder)) {
    $contactOrder['field1'] = array('allow_self_edit' => 1);
}
if (!array_key_exists('field2', $contactOrder)) {
    $contactOrder['field2'] = array('allow_self_edit' => 1);
}

$file = wa()->getConfig()->getConfigPath('person_fields_order.php', true, 'contacts');
$content = "<?php \nreturn " . var_export($contactOrder, true) . ";\n";

file_put_contents($file, $content);


$file = wa()->getConfig()->getConfigPath('custom_fields.php', true, 'contacts');
$content = '';
if (is_readable($file)) {
    $content = file_get_contents($file);
    copy($file, $file . '.orig');
}

$content = str_replace(');', 'new', trim($content));
$classes = array();
$matches = array();

if (preg_match_all('~(?P<class>new\s+waContact([^\s]|[^\(])+)(\s+\(|\()(?P<data>.+)\),\s*(?=new)~isU', $content, $matches, PREG_SET_ORDER)) {
    $classes = array_column($matches, 'class');
}

$fields = array();
foreach ($matches as $item) {
    if (preg_match('~^(\'|")(?P<field>[^\'"]+)(\'|")~', trim($item['data']), $m)) {
        var_dump($m);
        $fields[] = $m['field'];
    }
}



if (!in_array('field1', $fields)) {
    $matches[] = array(
        'class' => 'new waContactCheckboxField',
        'data' => '\'field1\', \'Доступ к API разрешен\', array()',
    );
}

if (!in_array('field2', $fields)) {
    $matches[] = array(
        'class' => 'new waContactStringField',
        'data' => '\'field2\', \'Ключ к API\', array()',
    );
}

$content = "<?php\nreturn array(\n";
foreach ($matches as $field) {
    $content .= "\t{$field['class']}({$field['data']}),\n";
}
$content .= ");\n";

file_put_contents($file, $content);

Модераторы завернули плагин, написав, что оно некорректно работает и что регулярное выражение использовать нельзя, но рекомендаций не дали.

Как решить вопрос, чтобы оно все работало правильно, более культурно и удовлетвоаряло модераторов?


Спасибо всем кто ответит.

3 ответа

  • 1
    Михаил Проектов 3 ноября 2016 08:07 # Решение

    Попробуйте методы из

    /**
     * Static class to manage contact fields
     */
    class waContactFields
    

    Например там есть

        /**
         * Add a new field to custom_fields.php if its id is unique (throws waException otherwise)
         * @throws waException
         * @param waContactField $field
         * @deprecated use ::updateField() instead
         */
        public static function createField($field)

  • 1
    Павел Иванов 21 февраля 2020 03:38 #

    Часов 8 искал как из плагина добавлять новые поля контакта. Переписывать файлы напрямую боялся из за этого поста(что модераторам не понравится) а документации вообще никакой нигде. На форумах даже не поднималась тема. 

    Пока понял как  записать поле в custom_fields.php

    Берём целиком массив который требуется записать

    в моём случае это 


    	$field = waContactStringField::__set_state(array(
         'id' => 'inn',
         'options' => 
        array (
          'storage' => 'data',
          'validators' => 
          waStringValidator::__set_state(array(
             'messages' => 
            array (
              'required' => 'Нужно заполнить',
              'invalid' => 'Неверно',
              'max_length' => 'Пожалуйста, не более 0 символов',
              'min_length' => 'Пожалуйста, не менее 0 символов',
            ),
             'options' => 
            array (
              'required' => false,
              'storage' => 'data',
            ),
             'errors' => 
            array (
            ),
             '_type' => 'waStringValidator',
          )),
          'unique' => false,
          'allow_self_edit' => false,
          'required' => false,
        ),
         'name' => 
        array (
          'ru_RU' => 'ИНН',
        ),
         '_type' => 'waContactStringField',
      ));

    и передаём 

    waContactFields::createField($field);

    Теперь чтобы включить это поле нужно его ещё в company_fields_order.php записать. Ищем дальше.

  • 0
    Артем Причиненко 3 ноября 2016 09:25 #

    Спасибо все решил!

    Не понятно почему в поддержке не смогли на это ответить :(

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите