Вход Регистрация
Файл: system/fields/listbitmask.php
Строк: 150
<?php

class fieldListBitmask extends cmsFormField {

    public 
$title       LANG_PARSER_LIST_MULTIPLE;
    public 
$sql         'varchar({max_length}) NULL DEFAULT NULL';
    public 
$allow_index true;
    public 
$filter_type 'str';
    public 
$var_type    'array';

    public function 
getOptions(){
        return array(
            new 
fieldCheckbox('is_checkbox_multiple', array(
                
'title'   => LANG_PARSER_BITMASK_CHECKBOX_MULTIPLE,
                
'default' => true
            
)),
            new 
fieldString('list_class', array(
                
'title'   => LANG_PARSER_BITMASK_LIST_CLASS,
                
'default' => 'multiple_tags_list',
                
'extended_option' => true
            
)),
            new 
fieldNumber('max_length', array(
                
'title'   => LANG_PARSER_BITMASK_MAX,
                
'hint'    => LANG_PARSER_BITMASK_MAX_HINT,
                
'default' => 64,
                
'rules' => array(
                    array(
'min'1)
                )
            )),
            new 
fieldCheckbox('is_autolink', array(
                
'title' => LANG_PARSER_LIST_IS_AUTOLINK,
                
'hint'  => LANG_PARSER_LIST_IS_AUTOLINK_FILTER,
                
'default' => false,
                
'extended_option' => true
            
))
        );
    }

    public function 
getFilterInput($value) {

        if(!
$this->show_filter_input_title){
            
$this->element_title '';
        }

        return 
$this->getInput($value);

    }

    public function 
getStringValue($value){

        if (!
$value) { return ''; }

        
$items $this->getListItems();

        
$string '';

        if (
$items) {

            
$pos 0$list = array();

            foreach(
$items as $key => $item){

                if(!
is_array($value)){

                    if (
substr($value$pos1) == 1){
                        
$list[] = $item;
                    }
                    
$pos++;
                    if (
$pos+strlen($value)) { break; }

                } else {

                    if(
in_array($key$value)){
                        
$list[] = $item;
                    }

                }

            }

            
$string implode(', '$list);

        }

        return 
$string;

    }

    public function 
parse($value){

        if (!
$value) { return LANG_NO; }

        
$items $this->getListItems();

        
$html '';

        if (
$items) {
            
$is_autolink $this->getOption('is_autolink');
            
$pos 0;
            
$html .= '<ul class="'.$this->getOption('list_class').' list-unstyled">';
            foreach(
$items as $key => $item){
                if (
substr($value$pos1) == 1){
                    if(
$is_autolink){
                        
$html .= '<li class="list-inline-item"><a class="listbitmask_autolink '.$this->item['ctype_name'].'_listbitmask_autolink" href="'.href_to($this->item['ctype_name']).'?'.$this->name.'%5B%5D='.urlencode($key).'">'.html($itemfalse).'</a></li>';
                    } else {
                        
$html .= '<li class="list-inline-item"><span>' html($itemfalse) . '</span></li>';
                    }
                }
                
$pos++;
                if (
$pos+strlen($value)) { break; }
            }
            
$html .= '</ul>';
        }

        return 
$html;
    }

    public function 
setOptions($options){
        
parent::setOptions($options);
        if (!isset(
$this->items) && $this->hasDefaultValue()){
            
$this->items string_explode_list($this->getDefaultValue());
            
ksort($this->items);
            
$this->default null;
        }
    }

    public function 
parseValue($values$return_as_array false){

        if (!
$values || !is_array($values)) { return ''; }

        
$items $this->getListItems();
        
$value $return_as_array ? [] : '';

        if (
$items){
            foreach(
$items as $key => $title){
                if(
$return_as_array){
                    if(
in_array($key$values)){
                        
$value[] = $key;
                    }
                } else {
                    
$value .= in_array($key$values) ? '1' '0';
                }
            }
        }

        return 
$value;

    }

    public function 
store($value$is_submitted$old_value=null){

        
$value $this->parseValue($value, ($this->context === 'filter'));

        if (
is_string($value) && mb_strpos($value'1') === false){
            return 
'';
        }

        return 
$value;

    }

    public function 
storeFilter($value){
        return 
$this->store($valuefalse);
    }

    public function 
applyFilter($model$values) {

        if (!
is_array($values)) { return parent::applyFilter($model$values); }

        
$filter $this->parseValue($values);
        if (!
$filter) { return parent::applyFilter($model$values); }

        
$filter str_replace('0''_'$filter) . '%';

        return 
$model->filterLike($this->name$filter);

    }

    public function 
getInput($value){

        
$this->data['items']    = $this->getListItems();
        
$this->data['selected'] = [];

        if(
$value){
            if(!
is_array($value)){
                
$pos 0;
                foreach(
$this->data['items'] as $key => $title){
                    if(
mb_substr($value$pos1) == 1){
                        
$this->data['selected'][] = is_numeric($key) ? intval($key) : $key;
                    }
                    
$pos++;
                    if(
$pos+mb_strlen($value)){ break; }
                }
            } else {

                foreach (
$value as $k => $v) {
                    
$this->data['selected'][] = is_numeric($v) ? intval($v) : $v;
                }

            }
        }

        return 
parent::getInput($value);

    }

    public function 
hookAfterUpdate($content_table_name$field$field_old$model){

        
$items $model->limit(false)->
                
selectOnly('id')->
                
select($field_old['name'])->
                
get($content_table_name, function($item$model)use($field_old){
                    return 
$item[$field_old['name']];
                });

        if(!
$items || trim($field_old['values']) == trim($field['values'])){
            return 
parent::hookAfterUpdate($content_table_name$field$field_old$model);
        }

        
$old_rows string_explode_list($field_old['values']);
        
ksort($old_rows);
        
$new_rows string_explode_list($field['values']);
        
ksort($new_rows);

        foreach (
$items as $id => $item_value) {

            if(!
$item_value){ continue; }

            
// Формируем старый массив значений
            
$old_item_values = [];

            
$pos 0;

            foreach(
$old_rows as $key => $value){
                if (
substr($item_value$pos1) == 1){
                    
$old_item_values[] = $key;
                }
                
$pos++;
            }

            
// Формируем новую битовую маску
            
$new_item_value '';

            foreach(
$new_rows as $nkey => $title){
                
$new_item_value .= in_array($nkey$old_item_values) ? '1' '0';
            }

            
// записываем обратно в базу
            
$model->update($content_table_name$id, [
                
$field_old['name'] => $new_item_value
            
], true);

        }

        return 
parent::hookAfterUpdate($content_table_name$field$field_old$model);

    }

}
Онлайн: 1
Реклама