Задача в типе контента статьи, создано поле с датой, к этому полю нужно прибавить другое поле с количеством месяцев=выводить новую дату.
Удалось создать новое поле и получить значение с новой датой, она выводится, но не записывается в дату и из-за этого не работает фильтр, я так подозреваю, помогите разобраться, пожалуйста, ниже код файла нового поля poverka.php из system/fields
<?php class fieldPoverka extends cmsFormField { public $title = 'Дата следующей поверки'; public $sql = 'TINYINT(1) UNSIGNED DEFAULT 1'; public $is_virtual = true; public $allow_index = false; public $filter_type = false; public function getOptions() { return [ new fieldCheckbox('show_time', [ 'title' => LANG_PARSER_DATE_SHOW_TIME, 'default' => false, 'extended_option' => true ]), new fieldCheckbox('filter_range', [ 'title' => LANG_PARSER_NUMBER_FILTER_RANGE, 'default' => true ]) ]; } public function getRules() { if ($this->context === 'filter' && $this->getOption('filter_range')) { $this->rules[] = ['date_range']; } else { $this->rules[] = ['date']; } return $this->rules; } public function parse($value){ $date = new DateTime($this->item['datapoverkiposle']); $date->add(new DateInterval('P'.$this->item['mpi'].'M')); return html_date( $date->format('Y-m-d'), $this->getOption('show_time')); } public function getStringValue($value) { if (!$value) { return ''; } if (is_array($value)) { $result_string = ''; if (!empty($value['from'])) { $result_string .= LANG_FROM . ' ' . $this->getStringValue($value['from']) . ' '; } if (!empty($value['to'])) { $result_string .= LANG_TO . ' ' . $this->getStringValue($value['to']); } return $result_string; } return date(cmsConfig::get('date_format'), strtotime($value)); } public function getFilterInput($value) { if ($this->getOption('filter_range')) { $from = !empty($value['from']) ? date('d.m.Y', strtotime($value['from'])) : false; $to = !empty($value['to']) ? date('d.m.Y', strtotime($value['to'])) : false; if (!$this->show_filter_input_title) { $this->title = false; } return cmsTemplate::getInstance()->renderFormField($this->class . '_range', [ 'field' => $this, 'from' => $from, 'to' => $to ]); } else { return parent::getFilterInput($value); } } public function applyFilter($model, $value) { if (!is_array($value) || !empty($value['date'])) { if (!empty($value['date'])) { $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']); } $date_start = date('Y-m-d', strtotime($value)); $date_final = date('Y-m-d', strtotime($value) + 60 * 60 * 24); return $model->filterBetween($this->name, $date_start, $date_final); } elseif (!empty($value['from']) || !empty($value['to'])) { if (!empty($value['from'])) { $model->filterGtEqual($this->name, date('Y-m-d', strtotime($value['from']))); } if (!empty($value['to'])) { $model->filterLtEqual($this->name, date('Y-m-d', strtotime($value['to']) + 60 * 60 * 24)); } return $model; } return parent::applyFilter($model, $value); } public function getDefaultVarType($is_filter = false) { if ($this->context === 'filter') { $is_filter = true; } if (($is_filter && $this->getOption('filter_range')) || $this->getOption('show_time')) { $this->var_type = 'array'; } return parent::getDefaultVarType($is_filter); } public function store($value, $is_submitted, $old_value = null) { // Если ячейка в БД начинается на date_, то cmsDatabase в prepareValue // null будет CURRENT_TIMESTAMP $default_null = strpos($this->name, 'date_') === 0 ? 0 : null; if (!$value) { return $default_null; } if (!is_array($value) || !empty($value['date'])) { if (is_array($value)) { if (!empty($value['date'])) { $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']); return date('Y-m-d H:i:s', strtotime($value)); } } else { return date('Y-m-d', strtotime($value)); } } elseif (!empty($value['from']) || !empty($value['to'])) { if (!empty($value['from'])) { $value['from'] = $this->store($value['from'], $is_submitted, $old_value); } if (!empty($value['to'])) { $value['to'] = $this->store($value['to'], $is_submitted, $old_value); } return $value; } return $default_null; } public function storeFilter($value) { return $this->store($value, false); } public function getInput($value) { if ($value) { if (is_array($value)) { if (!empty($value['date'])) { $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']); } else { $value = null; } } } $this->data['show_time'] = $this->getOption('show_time'); $this->data['date'] = $value ? date('d.m.Y', strtotime($value)) : ''; if ($this->data['show_time']) { if (!$value) { $this->data['hours'] = 0; $this->data['mins'] = 0; } else { list($this->data['hours'], $this->data['mins']) = explode(':', date('H:i', strtotime($value))); } $this->data['fname_date'] = $this->element_name . '[date]'; $this->data['fname_hours'] = $this->element_name . '[hours]'; $this->data['fname_mins'] = $this->element_name . '[mins]'; } else { $this->data['fname_date'] = $this->element_name; } return parent::getInput($value); } }
2. Файл шаблона poverka.tpl.php
<?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?> <div <?php echo html_attr_str($field->data['dom_attr']); ?>> <?php foreach ($field->data['items'] as $key => $title) { ?> <div class="custom-control custom-radio"> <?php $checked = ((string) $value === (string) $key) ? 'checked' : ''; $id = 'radio-'.$field->id.$key; ?> <input type="radio" <?php echo $checked; ?> id="<?php html($id); ?>" name="<?php echo $field->element_name; ?>" value="<?php html($key); ?>" class="custom-control-input"> <label class="custom-control-label" for="<?php html($id); ?>"> <?php echo $title; ?> </label> </div> <?php } ?> </div>
3. Файл шаблона фильтра poverka_range.tpl.php
<?php $this->addTplJSNameFromContext([ 'jquery-ui', 'i18n/jquery-ui/'.cmsCore::getLanguageName() ]); ?> <?php $this->addTplCSSNameFromContext('jquery-ui'); ?> <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?> <?php echo LANG_FROM . ' ' . html_datepicker($field->element_name.'[from]', $from, array('id' => $field->id.'_from')).' '; ?> <?php echo LANG_TO . ' ' . html_datepicker($field->element_name.'[to]', $to, array('id' => $field->id.'_to')); ?>