HEX
Server: Apache/2.4.25 (Debian)
System: Linux server17 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
User: web37 (1062)
PHP: 7.4.30
Disabled: show_source, highlight_file, apache_child_terminate, apache_get_modules, apache_note, apache_setenv, virtual, dl, disk_total_space, posix_getpwnam, posix_getpwuid, posix_mkfifo, posix_mknod, posix_setpgid, posix_setsid, posix_setuid, posix_uname, proc_nice, openlog, syslog, pfsockopen
Upload Files
File: /var/www/web37/htdocs/fickanzeiger/models/ExtraFieldModel.php
<?php
/**
 * Arfooo
 * 
 * @package    Arfooo
 * @copyright  Copyright (c) Arfooo Annuaire (fr) and Arfooo Directory (en)
 *             by Guillaume Hocine (c) 2007 - 2010
 *             http://www.arfooo.com/ (fr) and http://www.arfooo.net/ (en)
 * @author     Guillaume Hocine & Adrian Galewski
 * @license    http://creativecommons.org/licenses/by/2.0/fr/ Creative Commons
 */


class ExtraFieldModel extends Model
{
    protected $primaryKey = "fieldId";

    function getCategoryFields($categoryId)
    {
        $c = new Criteria();
        $c->addInnerJoin("extrafieldcategories", "extrafieldcategories.fieldId", "extrafields.fieldId");
        $c->addInnerJoin("categoryparents", "categoryparents.parentId", "extrafieldcategories.categoryId");
        $c->add("categoryparents.childId", $categoryId);
        $c->addOrder("position");

        $fields = $this->findAll($c);
        return $fields;
    }

    function getOptions($fieldId)
    {
        $c = new Criteria();
        $c->add("fieldId", $fieldId);
        $c->addOrder("position");

        $options = $this->extraFieldOption->findAll($c);
        return $options;
    }

    function getCategoryFieldsWithOptions($categoryId)
    {
        $fields = $this->getCategoryFields($categoryId);
        $extraFields = array();

        foreach ($fields as $field) {
            $extraFields[$field['fieldId']] = $field;
            $extraFields[$field['fieldId']]['options'] = array();
            if ($field['config']) {
                $extraFields[$field['fieldId']]['config'] = unserialize($field['config']);
            } else {
                $extraFields[$field['fieldId']]['config'] = array();
            }
        }

        $c = new Criteria();
        $c->add("fieldId", array_keys($extraFields), "IN");
        $options = $this->extraFieldOption->findAll($c);

        foreach ($options as $option) {
            $extraFields[$option['fieldId']]['options'][$option['value']] = $option;
        }

        return $extraFields;
    }

    function validate($newItem)
    {
        $extraFields = $this->extraField->getCategoryFieldsWithOptions($newItem->categoryId);

        foreach ($extraFields as $field) {
            $fieldId = $field['fieldId'];

            if ($field['required']
                && (empty($newItem->extraField)
                    || empty($newItem->extraField[$fieldId])
                    )
            ) {
                return "You don't fill required field " . $field['name'];
            }

            if ($field['type'] == 'file') {
                $file = new UploadedFile('extraField_' . $fieldId . '_file');
                $extensions = preg_split('/\s*,\s*/', $field['config']['extensions']);
                $file->addFilter('extension', $extensions);
                $file->addFilter('maxSize', intval($field['config']['maxSize']) * 1024);
                if ($file->wasUploaded()) {
                    try {
                        $file->validate();
                    } catch (Exception $e) {
                        return $e->getMessage();
                    }
                }
            }
        }
    }

    function saveExtraFieldsValues($item, $newItem)
    {
        $fields = $this->getCategoryFieldsWithOptions($item->categoryId);
        $itemId = $item->siteId;

        $c = new Criteria();
        $c->addInnerJoin('extrafields', 'extrafields.fieldId', 'extrafieldvalues.fieldId');
        $c->add('type', 'file');
        $files = $this->extraFieldValue->getArray($c, 'text', 'extrafields.fieldId');

        $c = new Criteria();
        $c->add("itemId", $itemId);
        $this->extraFieldValue->del($c);

        foreach ($fields as $fieldId => $field) {
            $extraFieldValue = new ExtraFieldValueRecord();
            $extraFieldValue->itemId = $itemId;
            $extraFieldValue->fieldId = $fieldId;

            if (!isset($newItem->extraField[$fieldId])) {
                continue;
            }

            $newItemExtraFieldData = $newItem->extraField[$fieldId];

            try {
                switch ($field['type']) {
                    case "text":
                    case "textarea":
                        $extraFieldValue->text = $newItemExtraFieldData;
                        break;

                    case "select":
                    case "radio":
                        if (!isset($field['options'][$newItemExtraFieldData])) {
                            continue 2;
                        }

                    case "range":
                        $extraFieldValue->value = $newItemExtraFieldData;
                        break;

                    case 'url':
                        $extraFieldValue->text = serialize($newItemExtraFieldData);
                        break;

                    case "checkbox":
                        $value = 0;

                        foreach ($newItemExtraFieldData as $checkBoxValue) {
                            if (!isset($field['options'][$checkBoxValue])) {
                                continue 3;
                            }
                            $value += pow(2, $checkBoxValue - 1); //minus 1 because we count from 1,2,3,4.. to have 1,2,4,8
                        }

                        $extraFieldValue->value = $value;
                        break;

                    case 'file':
                        $file = new UploadedFile('extraField_' . $fieldId . '_file');

                        if (!empty($files[$fieldId])) {
                            $data = unserialize($files[$fieldId]);
                        } else {
                            $data = array();
                        }

                        $data['title'] = $newItemExtraFieldData['title'];

                        if ($file->wasUploaded()) {
                            $filesPath = CODE_ROOT_DIR . 'uploads/files/';
                            $file->setSavePath($filesPath);
                            $file->save();
                            $fileSrc = $file->getSavedFileName();
                            $data['fileSrc'] = $fileSrc;
                        }

                        $extraFieldValue->text = serialize($data);
                }

                $extraFieldValue->save();

            } catch (Exception $e) {

            }
        }

        $this->site->updateByPk(array("haveExtraFields" => !empty($newItem->extraField) ? "1" : "0"), $itemId);
    }

    function getItemExtraFields($item)
    {
        $extraFields = $this->getCategoryFieldsWithOptions($item->categoryId);
        $itemExtraFields = array();

        $c = new Criteria();
        $c->add("itemId", $item->siteId);
        $extraFieldValues = $this->extraFieldValue->getArray($c, "*", "fieldId", true);

        foreach ($extraFields as $fieldId => $extraField) {
            if (empty($extraFieldValues[$fieldId])) {
                continue;
            }

            $extraFieldValue = $extraFieldValues[$fieldId];

            switch ($extraField['type']) {
                case "text":
                case "textarea":
                    $itemExtraFieldValue = $extraFieldValue['text'];
                    $itemExtraFieldLabel = $extraFieldValue['text'];
                    break;

                case "select":
                case "radio":
                    $itemExtraFieldValue = $extraFieldValue['value'];
                    $itemExtraFieldLabel = $extraField['options'][$extraFieldValue['value']]['label'];
                    break;

                case "checkbox":
                    $itemExtraFieldValue = array();
                    $itemExtraFieldLabel = array();

                    foreach ($extraField['options'] as $option) {
                        if ($extraFieldValue['value'] & pow(2, $option['value'] - 1)) {
                            $itemExtraFieldValue[] = $option['value'];
                            $itemExtraFieldLabel[] = $option['label'];
                        }
                    }
                    break;

                case "range":
                    $itemExtraFieldValue = $extraFieldValue['value'];
                    $itemExtraFieldLabel = $extraFieldValue['value'];
                    break;

                case 'url':
                case 'file':
                    $itemExtraFieldValue = unserialize($extraFieldValue['text']);
                    $itemExtraFieldLabel = '';
                    break;
            }

            $itemExtraFields[$fieldId] = array(
                'name'   => $extraField['name'],
                'type'   => $extraField['type'],
                'value'  => $itemExtraFieldValue,
                'label'  => $itemExtraFieldLabel,
                'suffix' => $extraField['suffix'],
                'config' => $extraField['config']
            );
        }

        return $itemExtraFields;
    }

    function createExtraFieldsCriteria($categoryId, $extraFieldsValues)
    {
        $c = new Criteria();
        $extraFields = $this->getCategoryFields($categoryId);

        foreach ($extraFields as $extraField) {
            $fieldId = $extraField['fieldId'];

            if (empty($extraFieldsValues[$fieldId])
                || ($extraField['type'] == "range"
                && empty($extraFieldsValues[$fieldId]['from'])
                && empty($extraFieldsValues[$fieldId]['to']))
            ) {
                continue;
            }

            $c2 = new Criteria();
            $prefix = Config::get("DB_PREFIX");
            $sql = "EXISTS (SELECT * FROM " . $prefix . "extrafieldvalues WHERE itemId = " . $prefix . "sites.siteId AND fieldId = '$fieldId' AND ";

            switch ($extraField['type']) {
                case "text":
                case "textarea":
                    $c2->add("text", $extraFieldsValues[$fieldId], "LIKE");
                    break;

                case "checkbox":
                    $value = 0;
                    $checkboxValues = $extraFieldsValues[$fieldId];

                    foreach ($checkboxValues as $checkBoxValue) {
                        $value += pow(2, $checkBoxValue - 1); //minus 1 because we count from 1,2,3,4.. to have 1,2,4,8
                    }

                    $c2->add("value & $value = $value");
                    break;

                case "select":
                case "radio":
                    $c2->add("value", $extraFieldsValues[$fieldId]);
                    break;

                case "range":
                    if (!empty($extraFieldsValues[$fieldId]['from'])) {
                        $c2->add("value", $extraFieldsValues[$fieldId]['from'], ">=");
                    }

                    if (!empty($extraFieldsValues[$fieldId]['to'])) {
                        $c2->add("value", $extraFieldsValues[$fieldId]['to'], "<=");
                    }
                    break;
            }

            $sql .= $c2->prepareQuery();
            $sql .= ")";
            $c->add($sql);
        }

        return $c;
    }

}

class ExtraFieldRecord extends ModelRecord
{

}