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(' ', $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();
}
}