Вход Регистрация
Файл: core/classes/form.class.php
Строк: 234
<?php
/******************************************************************************/
//                                                                            //
//                             InstantCMS v1.10                               //
//                        http://www.instantcms.ru/                           //
//                                                                            //
//                   written by InstantCMS Team, 2007-2012                    //
//                produced by InstantSoft, (www.instantsoft.ru)               //
//                                                                            //
//                        LICENSED BY GNU/GPL v2                              //
//                                                                            //
/******************************************************************************/

class cmsForm {

    private 
$kinds       = array('text','link','textarea','checkbox','radiogroup','list','menu');
    public  
$values      = array();
    public  
$form        = array();
    public  
$form_fields = array();
    private 
$form_id;
    public  
$is_admin;

    private static 
$cached_form_data   = array();
    private static 
$cached_form_fields = array();

    private function 
__construct($form_id$values = array(), $is_admin false) {

        
$this->form_id  cmsDatabase::getInstance()->escape_string($form_id);
        
$this->values   $values;
        
$this->is_admin $is_admin;

        
cmsCore::loadLanguage('components/forms');

        
$this->loadFormData();
        
$this->form_fields $this->getFormFields($this->form_id);

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Проверяет значения формы
     * @param int $form_id ID формы
     * @return array
     */
    
public static function getFieldsInputValues($form_id){

        
// Получаем данные без mysqli_real_escape_string
        
$form_array cmsCore::request('field''array');
        if(!
$form_array) { return array(); }
        foreach(
$form_array as $k=>$s){ $form_array[$k] = strip_tags($s); }

        
$formObj = new self($form_id$form_array);

        if(!
$formObj->form || !$formObj->form_fields) { return array(); }

        global 
$_LANG;

        
$output = array();

        
// Заполняем выходной массив значений
        // $output['values'] массив значений полей
        // $output['errors'] массив ошибок полей
        
foreach ($formObj->form_fields as $field) {

            
// Значение поля
            
$field_value array_key_exists($field['id'], $formObj->values) ? $formObj->values[$field['id']] : '';

            
$error '';

            
// проверяем заполненность поля если нужно
            
if($field['mustbe'] && !$field_value){

                
$error $_LANG['FIELD'].' "'.$field['title'].'" '.$_LANG['MUST_BE_FILLED'];

            } else {
                
cmsUser::sessionPut('form_last_'.$formObj->form_id.'_'.$field['id'], htmlspecialchars($field_value));
            }

            
// Заполняем массив значений полей, ключи массива id поля
            
$output['values'][$field['id']] = $field['config']['max'] ?
                                                
mb_substr($field_value0$field['config']['max']) :
                                                
$field_value;

            
// Заполняем массив ошибок
            
$output['errors'][$field['id']] = $error;

        }

        return 
$output;

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает html формы
     * @param int $form_id ID формы
     * @param array $values Значения полей
     * @param bool $is_admin
     * @return str HTML
     */
    
public static function displayForm($form_id$values = array(), $is_admin false){

        
$formObj = new self($form_id$values$is_admin);

        if(!
$formObj->form || !$formObj->form_fields) { return ''; }

        
// Формируем поля формы
        
foreach ($formObj->form_fields as $key => $field) {
            
$formObj->form_fields[$key]['field'] = $formObj->getFormField($field);
        }

        
ob_start();

        
cmsPage::includeTemplateFile('special/form.php', array('formObj'=>$formObj));

        return 
ob_get_clean();

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает массив значений полей формы
     * @param int $form_id ID формы
     * @param array $values Значения полей
     * @return array
     */
    
public static function getFieldsValues($form_id$values = array()){

        
$formObj = new self($form_id,$values);

        if(!
$formObj->form || !$formObj->form_fields) { return array(); }

        
// Формируем значения полей формы
        
foreach ($formObj->form_fields as $key => $field) {
            
$formObj->form_fields[$key]['field'] = $formObj->getFormFieldValue($field);
        }

        return 
$formObj->form_fields;

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает массив полей формы
     * @param int $form_id ID формы
     * @param array $values Значения полей
     * @param bool $only_mustbe Показывать только обязательные поля
     * @return array
     */
    
public static function getFieldsHtml($form_id$values = array(), $only_mustbe false){

        
$formObj = new self($form_id,$values);

        if(!
$formObj->form || !$formObj->form_fields) { return ''; }

        
// Формируем значения полей формы
        
foreach ($formObj->form_fields as $key => $field) {
            if(
$only_mustbe && !$field['mustbe']){ unset($formObj->form_fields[$key]); continue; }
            
$formObj->form_fields[$key]['field'] = $formObj->getFormField($field);
        }

        return 
$formObj->form_fields;

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Загружает данные формы в свойство объекта
     */
    
private function loadFormData(){

        
$this->form $this->getFormData($this->form_id);

        
// если форму получили по имени
        
$this->form_id $this->form $this->form['id'] : 0;

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает данные формы
     * @param int $form_id ID формы
     * @return array
     */
    
public static function getFormData($form_id){

        if(isset(
self::$cached_form_data[$form_id])) { return self::$cached_form_data[$form_id]; }

        if(
is_numeric($form_id)){
            
$where "id = '{$form_id}'";
        } else {
            
$where "title LIKE '{$form_id}'";
        }

        return 
cmsCore::callEvent('GET_FORM'cmsDatabase::getInstance()->get_fields('cms_forms'$where'*'));

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает поля формы
     * @param int $form_id ID формы
     * @return array
     */
    
public static function getFormFields($form_id){

        if(isset(
self::$cached_form_fields[$form_id])) { return self::$cached_form_fields[$form_id]; }

        
$form_fields = array();

        
$inDB cmsDatabase::getInstance();

        
$sql "SELECT * FROM cms_form_fields WHERE form_id = '{$form_id}' ORDER BY ordering ASC";
        
$res $inDB->query($sql);

        if (
$inDB->num_rows($res)){

            while(
$form_field $inDB->fetch_assoc($res)){

                
$form_field['config'] = cmsCore::yamlToArray($form_field['config']);
                
$form_fields[] = $form_field;

            }

        }

        return 
cmsCore::callEvent('GET_FORM_FIELDS'$form_fields);

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает значение поля формы из сессии
     * @param int $field_id ID поля формы
     * @return string
     */
    
private function getLastEnteredValue($field_id){

        
$ses_value cmsUser::sessionGet('form_last_'.$this->form_id.'_'.$field_id);

        if (
$ses_value){
            
cmsUser::sessionDel('form_last_'.$this->form_id.'_'.$field_id);
        }

        return (string)
$ses_value;

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает значение поля формы
     * @param int $field_id ID поля формы
     * @return string
     */
    
private function getFieldValue($field_id){

        
$field_value array_key_exists($field_id$this->values) ? htmlspecialchars($this->values[$field_id]) : '';

        return 
$field_value $field_value $this->getLastEnteredValue($field_id);

    }

// ============================================================================ //
// ============================================================================ //
    /**
     * Возвращает html поля формы
     * @param array $form_field Массив поля формы
     * @return string html
     */
    
public function getFormField($form_field){

        if(
in_array($form_field['kind'], $this->kinds)){
            
$method_name 'render'.icms_ucfirst($form_field['kind']);
            if(
method_exists($this$method_name)){

                return 
call_user_func_array(array($this$method_name), array($form_field));

            }
        }

    }
    
/**
     * Возвращает значение поля формы
     * @param array $form_field Массив поля формы
     * @return string html
     */
    
public function getFormFieldValue($form_field){

        if(
in_array($form_field['kind'], $this->kinds)){
            
$method_name 'get'.icms_ucfirst($form_field['kind']).'Value';
            if(
method_exists($this$method_name)){

                return 
call_user_func_array(array($this$method_name), array($form_field));

            }

            return (!empty(
$form_field['config']['text_is_link']) && $form_field['config']['text_link_prefix']) ?
                   
cmsPage::getMetaSearchLink($form_field['config']['text_link_prefix'], $this->getFieldValue($form_field['id'])) :
                   
$this->getFieldValue($form_field['id']);

        }

    }

// ============================================================================ //
// ========================   Методы полей формы   ============================ //
// ============================================================================ //
    
private function getLinkValue($form_field){

        
$value preg_replace ('/[^a-zA-ZА-Яа-я0-9-_./:]/ui'''$this->getFieldValue($form_field['id']));
        
$value htmlspecialchars(str_replace ('..''.'$value));

        return 
$value '<a href="/go/url='.$value.'" target="_blank">'.$value.'</a>' '';

    }

    private function 
getTextareaValue($form_field){

        return 
nl2br($this->getFieldValue($form_field['id']));

    }

    private function 
renderText($form_field){

        return 
'<input type="text"
                                  name="field['
.$form_field['id'].']"
                                  maxlength="'
.(int)$form_field['config']['max'].'"
                                  value="'
.$this->getFieldValue($form_field['id']).'"
                                  style="width: '
.(int)$form_field['config']['size'].'px"
                                  class="text-input form_text" />'
;

    }

    private function 
renderLink($form_field){

        return 
$this->renderText($form_field);

    }

    private function 
renderTextarea($form_field){

        return 
'<textarea name="field['.$form_field['id'].']"
                         class="text-input form_textarea"
                         maxlength="'
.(int)$form_field['config']['max'].'"
                         style="width: '
.(int)$form_field['config']['size'].'px"
                         rows="'
.(int)$form_field['config']['rows'].'">'.$this->getFieldValue($form_field['id']).'</textarea>';

    }

    private function 
renderCheckbox($form_field){

        global 
$_LANG;

        
$default $this->getFieldValue($form_field['id']);
        
$default $default $default $form_field['config']['checked'];

        
$field  '<label><input type="radio" name="field['.$form_field['id'].']" value="'.$_LANG['YES'].'" ';
        
$field .= ($default || $default == $_LANG['YES']) ? 'checked="checked"' '';
        
$field .= '/>'.$_LANG['YES'].'</label> ';
        
$field .= '<label><input type="radio" name="field['.$form_field['id'].']" value="'.$_LANG['NO'].'" ';
        
$field .= (!$default || $default == $_LANG['NO']) ? 'checked="checked"' '';
        
$field .= '/>'.$_LANG['NO'].'</label> ';

        return 
$field;

    }

    private function 
renderRadiogroup($form_field){

        
$field '';

        
$items   explode('/'trim($form_field['config']['items']));
        
$default $this->getFieldValue($form_field['id']);

        if(
$items){
            foreach(
$items as $i){

                
$i trim(htmlspecialchars($i));

                
$field .= '<label><input type="radio" name="field['.$form_field['id'].']" value="'.$i.'" ';
                if(
$i == $default) { $field .= 'checked="checked"'; }
                
$field .= ' />'.$i.'</label><br/>';

            }
        }

        return 
$field;

    }

    private function 
renderList($form_field){

        
$field '';

        
$items   explode('/'trim($form_field['config']['items']));
        
$default $this->getFieldValue($form_field['id']);

        if(
$items){

            
$field .= '<select class="text-input form_list" style="width: '.(int)$form_field['config']['size'].'px" name="field['.$form_field['id'].']">';

            foreach(
$items as $i){

                
$i trim(htmlspecialchars($i));

                
$field .= '<option value="'.$i.'"';
                if(
$i == $default) { $field .= 'selected="selected"'; }
                
$field .= ' >'.$i.'</option>';

            }

            
$field .= '</select>';

        }

        return 
$field;

    }

    private function 
renderMenu($form_field){

        
$field '';

        
$items   explode('/'trim($form_field['config']['items']));
        
$default $this->getFieldValue($form_field['id']);

        if(
$items){

            
$field .= '<select class="text-input form_menu" style="width: '.(int)$form_field['config']['size'].'px" name="field['.$form_field['id'].']" size="5">';

            foreach(
$items as $i){

                
$i trim(htmlspecialchars($i));

                
$field .= '<option value="'.$i.'"';
                if(
$i == $default) { $field .= 'selected="selected"'; }
                
$field .= ' >'.$i.'</option>';

            }

            
$field .= '</select>';

        }

        return 
$field;

    }
// ============================================================================ //
// ============================================================================ //

}

?>
Онлайн: 1
Реклама