<?php
/**
 * ZenTaoPHP的验证和过滤类。
 * The validater and fixer class file of ZenTaoPHP framework.
 *
 * The author disclaims copyright to this source code.  In place of
 * a legal notice, here is a blessing:
 * 
 *  May you do good and not evil.
 *  May you find forgiveness for yourself and forgive others.
 *  May you share freely, never taking more than you give.
 */

helper::import(dirname(dirname(__FILE__)) . '/base/filter/filter.class.php');
/**
 * validater类，检查数据是否符合规则。
 * The validater class, checking data by rules.
 * 
 * @package framework
 */
class validater extends baseValidater
{
}

/**
 * fixer类，处理数据。
 * fixer class, to fix data types.
 * 
 * @package framework
 */
class fixer extends baseFixer
{
    /**
     * 如果提交的数据中包含工作流中扩展的字段，且字段是以数组的形式提交，则把提交的值拼接成字符串，防止出错。
     * If the submitted data contains extended fields in the workflow and the fields are submitted as arrays,
     * the submitted values are concatenated into strings to prevent errors.
     * 
     * @param  string $fields
     * @access public
     * @return object
     */
    public function get($fields = '')
    {
        global $app, $config, $dbh;
        if(version_compare($config->version, 'pro3.0.1', '<=')) return parent::get($fields);

        $fields = str_replace(' ', '', trim($fields));

        /* Get extend field by flow. */
        $flowFields = array();
        $moduleName = $app->getModuleName();
        $stmt = $dbh->query("SELECT * FROM " . TABLE_WORKFLOWFIELD . " WHERE `module` = '{$moduleName}' and `buildin` = '0'");
        while($flowField = $stmt->fetch()) $flowFields[$flowField->field] = $flowField;

        foreach($this->data as $field => $value)
        {
            /* Implode array when form has array. */
            if(isset($flowFields[$field]) and is_array($value))
            {
                $canImplode = true;
                foreach($value as $k => $v)
                {
                    if(is_object($v) or is_array($v))
                    {
                        $canImplode = false;
                        break;
                    }
                }
                if($canImplode) $this->data->$field = implode(',', $value);
            }
            $this->specialChars($field);
        }

        if(empty($fields)) return $this->data;
        if(strpos($fields, ',') === false) return $this->data->$fields;

        /* Process fields for check by key. */
        $fields = array_flip(explode(',', $fields));
        foreach($this->data as $field => $value)
        {
            if(!isset($fields[$field])) unset($this->data->$field);
            if(!in_array($field, $this->stripedFields)) $this->specialChars($field);
        }

        return $this->data;
    }
}
