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

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

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

Нашел информацию, что надо дописывать в файлы: 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);

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

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


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

2 ответа

  • 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
    Артем Причиненко 3 ноября 2016 09:25 #

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

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

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

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