HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/heifetz/heifetz-app/models/FormHelper.php
<?php

namespace Models;


use Core\Models\OldUser;
use Helpers\ArrayHelper;
use Helpers\TemplateHelper;
use Models\Repositories\DictionaryRepository;

class FormHelper
{

    public static function recruitSelect($id, $name, $list, $selected, $options)
    {
        $spacer = '';
        $disabled = false;

        ob_start();
        ?>
        <select id="<?= $id; ?>" name="<?= $name; ?>" class="form-control select2">
            <option value="0">Все</option>
            <?php foreach ($list as $item) { ?>
                <option
                    value="<?= $item->id; ?>"
                    <?= $item->id == $selected ? 'selected' : ''; ?>
                    <?= $disabled ? 'disabled' : ''; ?>><?= $spacer . $item->username; ?></option>
            <?php } ?>
        </select>
        <?php

        return ob_get_clean();
    }

    public static function professionSelect(string $id, $name, $list, $selected = false, $options = [])
    {
        $spacer = '';
        $class = 'select2';

        ob_start();
        ?>
        <select id="<?= $id; ?>" name="<?= $name; ?>" class="form-control
        <?php
        if (isset($options['class'])) {
            echo $options['class'];
        } else {
            echo $class;
        }
        ?>"
            <?php if (isset($options['disabled']) && $options['disabled'] == true) { ?>
                disabled
            <?php } ?>>
            <?php if (isset($options['none']) && $options['none']) { ?>
                <option value="-1"><?= true === $options['none'] ? 'Не указано' : $options['none']; ?></option>
            <?php } ?>
            <?php if (isset($options['all']) && $options['all']) { ?>
                <option value="0"><?= true === $options['all'] ? 'Все' : $options['all']; ?></option>
            <?php } ?>
            <?php foreach ($list as $item) { ?>
                <?php $itemId = is_array($item) ? $item['id'] : $item->id; ?>
                <?php $itemName = is_array($item) ? $item['name'] : $item->name; ?>
                <option value="<?= $itemId; ?>" <?= $itemId == $selected ? 'selected' : ''; ?>><?= $spacer . $itemName; ?></option>
            <?php } ?>
        </select>
        <?php

        return ob_get_clean();
    }

    protected static function needToShow(array $factory, array $idsToShow): bool
    {
        if (in_array($factory['id'], $idsToShow)) {
            return true;
        }

        if (!empty($factory['childs'])) {
            $needToShow = false;
            foreach ($factory['childs'] as $child) {
                $needToShow |= in_array($child['id'], $idsToShow) || !empty($child['childs']) && self::needToShow($child, $idsToShow);
            }

            return $needToShow;
        }

        return false;
    }

    /**
     * Рисует select предприятий
     *
     * Список опций:
     * tree - отображать деревом
     * all - добавить пункт все предприятия
     * none - добавить пункт не указано
     * parents - = 'disable' запрещать выбирать родительские предприятия
     *
     * @param string $id
     * @param string $name
     * @param $list
     * @param mixed $selected
     * @param array $options
     *
     * @return string
     */
    public static function factorySelect(string $id, string $name, $list, $selected = false, array $options = []): string
    {
        $idsToShow = array_map(fn($item) => $item->id, (array) $list);

        $class = 'select2';
        $useTree = !empty($options['tree']) && $options['tree'];

        $factoriesDict = ArrayHelper::keyByField(Dictionary::getTableData(DictionaryRepository::TABLE_FACTORIES));
        $favoriteFactories = [];
        if (OldUser::isFreelancer() || OldUser::isRecruit()) {
            $favoritesIds = FavoriteDictionaryItem::getFavoriteItemsIds(Factories::$tableName);
            foreach ($factoriesDict as $factory) {
                if (in_array($factory->id, $favoritesIds)) {
                    $favoriteFactories[] = $factory;
                }
            }
        }
        $factories = ArrayHelper::toArray(Factories::buildTree($factoriesDict));

        ob_start();
        echo '<select id="' . $id . '" name="' . $name . '" class="form-control ' . ($options['class'] ?? $class) . '"' . (isset($options['disabled']) && $options['disabled'] ? 'disabled' : '') . '>';

        if (!empty($options['options'])) {
            foreach ($options['options'] as $value => $label) {
                echo '<option value="' . $value . '"' . ($value === $selected ? 'selected' : '') . '>' . $label . '</option>';
            }
        }

        if (isset($options['all']) && $options['all']) {
            echo '<option value="0"' . (0 == $selected ? 'selected' : '') . '>' . (is_string($options['all']) ? $options['all'] : 'Все предприятия') . '</option>';
        }

        if (isset($options['none']) && $options['none'] == true) {
            echo '<option value="-1"' . (-1 == $selected ? 'selected' : '') . '>Не указано</option>';
        }

        if (!empty($favoriteFactories)) {
            echo '<optgroup label="Избранные">';
            foreach ($favoriteFactories as $factory) {
                echo '<option value="' . $factory->id . '">' . $factory->name . '</option>';
            }
            echo '</optgroup>';
            echo '<optgroup label="Предприятия">';
        }

        foreach ($factories as $factory) {
            if (intval($factory['pid']) === 0) {
                $disabled = false;
                if (!in_array($factory['id'], $idsToShow)) {
                    if ($useTree) {
                        if (!self::needToShow($factory, $idsToShow)) {
                            continue;
                        }

                        $disabled = true;
                    } else {
                        continue;
                    }
                }

                if (!empty($options['parents']) && $options['parents'] === 'disabled') {
                    $disabled = !empty($factory['childs']);
                }

                echo '<option value="' . $factory['id'] . '" ' . ($factory['id'] == $selected ? 'selected' : '') . ' ' . ($disabled ? 'disabled' : '') . '>' . $factory['name'] . '</option>';

                self::renderChild($factory['id'], $factories, 1, $useTree, $idsToShow, $selected, $options);
            }
        }

        echo '</select>';
        if (!empty($favoriteFactories)) {
            echo '</optgroup>';
        }

        return ob_get_clean();
    }

    private static function renderChild($id, $factories, $lvl, $useTree, &$idsToShow, &$selected, &$options)
    {
        if (!empty($factories[$id]['childs'])) {
            foreach ($factories[$id]['childs'] as $childFactory) {
                if (self::needToShow($childFactory, $idsToShow)) {
                    $spacer = $useTree ? str_repeat('&nbsp;&nbsp;&nbsp;', $lvl) : '';

                    $disabled = false;
                    if (!empty($options['parents']) && $options['parents'] === 'disabled') {
                        $disabled = !empty($childFactory['childs']);
                    }

                    echo '<option value="' . $childFactory['id'] . '" ' . ($childFactory['id'] == $selected ? 'selected' : '') . ' ' . ($disabled ? 'disabled' : '') . '>' . $spacer . $childFactory['name'] . '</option>';
                    self::renderChild($childFactory['id'], [$childFactory['id'] => $childFactory], $lvl + 1, $useTree, $idsToShow, $selected, $options);
                }
            }
        }
    }

    public static function dictionarySelect($id, $name, $dictionary, $selected = false, $options = [], array $data = [])
    {
        $class = 'select2';
        if (!empty($options['class'])) {
            $class = $options['class'];
        }

        $multiple = '';
        if (isset($options['multiple']) && $options['multiple'] == true) {
            $multiple = 'multiple';
        }
        ob_start();
        echo '<select id="' . $id . '" name="' . $name . '" class="form-control ' . ($options['class'] ?? $class) . '"' . (isset($options['disabled']) && $options['disabled'] ? 'disabled' : '') . ' ' . $multiple . '>';

        if (isset($options['none']) && $options['none'] == true) {
            echo '<option value="-1">' . (true === $options['none'] ? 'Не указано' : $options['none']) . '</option>';
        }

        if (isset($options['all']) && $options['all']) {
            echo '<option value="0"' . (0 == $selected ? 'selected' : '') . '>' . (is_string($options['all']) ? $options['all'] : 'Все') . '</option>';
        }

        if (isset($options['activeOnly'])) {
            $activeOnly = $options['activeOnly'];
        }

        if (isset($options['showDeleted'])) {
            $showDeleted = $options['showDeleted'];
        }

        $showOnlySelectedDeleted = false;
        if (isset($options['showOnlySelectedDeleted'])) {
            $showOnlySelectedDeleted = $options['showOnlySelectedDeleted'];
        }

        if (empty($data)) {
            $list = Dictionary::getTableData($dictionary, $activeOnly ?? false, $showDeleted ?? false);
        } else {
            $list = $data;
        }

        if (isset($options['showParent']) && !$options['showParent']) {
            $parentIds = Factories::getParentArray();
        }

        $hasFavorite = false;
        if ($dictionary == DictionaryRepository::TABLE_FACTORIES) {
            if (OldUser::isFreelancer() || OldUser::isRecruit()) {
                $favoritesIds = FavoriteDictionaryItem::getFavoriteItemsIds(Factories::$tableName);
                foreach ($list as $index => $factory) {
                    if (in_array($factory->id, $favoritesIds)) {
                        if (!$hasFavorite) {
                            echo '<optgroup label="Избранные">';
                        }
                        echo '<option value="' . $factory->id . '">' . $factory->name . '</option>';
                        $hasFavorite = true;
                    }
                    if ($hasFavorite && $index == count($list) - 1) {
                        echo '</optgroup>';
                    }
                }
            }
            if ($hasFavorite) {
                echo '<optgroup label="Предприятия">';
            }
        }

        foreach ($list as $item) {
            if ($showOnlySelectedDeleted && ($item->deleted || !$item->active) && $item->id != $selected) {
                continue;
            }
            if (isset($options['showParent']) && !$options['showParent'] && in_array($item->id, $parentIds ?? [])) {
                continue;
            }
            $disabled = '';
            if (isset($options['disabled']) && $options['disabled']) {
                $disabled = 'disabled';
            }
            if ($item->deleted) {
                $item->name .= ' 🔴';
                $disabled = 'disabled';
            } elseif (!$item->active) {
                $item->name .= ' 🟠';
                $disabled = 'disabled';
            } elseif (isset($item->manual_disabled) && $item->manual_disabled) {
                $item->name .= ' 🔵';
                $disabled = 'disabled';
            }

            if (is_array($selected)) {
                $selectedAttr = in_array($item->id, $selected) ? 'selected' : '';
            } else {
                $selectedAttr = $item->id == $selected ? 'selected' : '';
            }

            echo '<option value="' . $item->id . '" ' . $selectedAttr . ' ' . $disabled . '>' . $item->name . '</option>';
        }
        echo '</select>';
        if ($dictionary == DictionaryRepository::TABLE_FACTORIES && $hasFavorite) {
            echo '</optgroup>';
        }

        return ob_get_clean();
    }

    public static function intervalSelect($id, $name, $selected = false, $items = ['none', 'day', 'week', 'month'], $options = [])
    {
        $class = 'select2';

        ob_start();
        echo '<select id="' . $id . '" name="' . $name . '" class="form-control ' . ($options['class'] ?? $class) . '"' . (isset($options['disabled']) && $options['disabled'] ? 'disabled' : '') . '>';

        $intervals = [
            'none' => 'Без интервала',
            'day' => 'День',
            'week' => 'Неделя',
            'month' => 'Месяц',
        ];

        foreach ($intervals as $key => $interval) {
            if (!in_array($key, $items)) {
                unset($intervals[$key]);
            }
        }

        foreach ($intervals as $key => $interval) {
            echo '<option value="' . $key . '" ' . ($key == $selected ? 'selected' : '') . '>' . $interval . '</option>';
        }
        echo '</select>';

        return ob_get_clean();
    }

    public static function userSelect($id, $name, $users, $selected = false, $options = [], $title = 'All users')
    {
        echo '<select id="' . $id . '" name="' . $name . '" class="select2">';
        if (isset($options['all']) && $options['all'] == true) {
            echo '<option value="0"' . (0 == $selected ? 'selected' : '') . '>' . Lang::__($title) . '</option>';
        }
        foreach ($users as $user) {
            echo '<option value="' . $user->id . '" ' . ($user->id == $selected ? 'selected' : '') . '>';
            echo empty($user->username) ? Lang::__('Unnamed') : $user->username;
            echo '</option>';
        }
        echo '</select>';
    }

    public static function customField(object $customFieldData)
    {
        ob_start();
        echo '<label class="control-label col-lg-4">' . $customFieldData->name . ':</label>';
        echo '<div class="col-lg-8">';
        switch ($customFieldData->type) {
            case TicketCustomField::TYPE_TEXT:
                echo '<input type="text" name="' . $customFieldData->slug . '" class="form-control" value="' . $customFieldData->value . '"/>';
                echo '</div>';
                break;
            case TicketCustomField::TYPE_MULTILINE:
                echo '<textarea type="text" name="' . $customFieldData->slug . '" class="form-control"/>' . $customFieldData->value . '</textarea>';
                echo '</div>';
                break;
            case TicketCustomField::TYPE_CHECKBOX:
                $values = explode('|', $customFieldData->settings);
                $selected = $customFieldData->value == $values[0];
                echo TemplateHelper::switch('', $customFieldData->slug, $selected, false, $values[0], $values[1], 'checkbox-big additional-field-switch');
                echo '</div>';
                break;
            case TicketCustomField::TYPE_MULTISELECT:
                echo '<select name="' . $customFieldData->slug . '[]" class="select2" multiple>';
                $settings = explode(',', $customFieldData->settings);
                $selectedValues = explode(',', $customFieldData->value);
                foreach ($settings as $item) {
                    $settingsArray = explode('|', $item);
                    $selected = in_array($settingsArray[0], $selectedValues) ? ' selected' : '';
                    echo '<option value="' . $settingsArray[0] . '"' . $selected . '>' . $settingsArray[1] . '</option>';
                }
                echo '</select>';
                echo '</div>';
                break;
            case TicketCustomField::TYPE_SELECT:
                echo '<select name="' . $customFieldData->slug . '" class="select2">';
                echo '<option ' . (empty($customFieldData->value) ? 'selected' : '') . '>Не выбрано</option>';
                $settings = explode(',', $customFieldData->settings);
                foreach ($settings as $item) {
                    $settingsArray = explode('|', $item);
                    $selected = $settingsArray[0] == $customFieldData->value ? ' selected' : '';
                    echo '<option value="' . $settingsArray[0] . '"' . $selected . '>' . $settingsArray[1] . '</option>';
                }
                echo '</select>';
                echo '</div>';
                break;
            case TicketCustomField::TYPE_DATE:
                echo '<div class="input-group">';
                echo '<span class="input-group-addon"><i class="icon-calendar22"></i></span>';
                $date = $customFieldData->value ? date('d.m.Y', strtotime($customFieldData->value)) : '';
                echo '<input type="text" name="' . $customFieldData->slug . '" class="form-control datepicker-manual" value="' . $date . '"/>';
                echo '</div>';
                echo '</div>';
                break;
        }

        return ob_get_clean();
    }

}