Поле дата - не работает фильтр после модернизации

InstantCMS 2.X
#1 2 ноября 2023 в 09:40

Задача в типе контента статьи, создано поле с датой, к этому полю нужно прибавить другое поле с количеством месяцев=выводить новую дату.

Удалось создать новое поле и получить значение с новой датой, она выводится, но не записывается в дату и из-за этого не работает фильтр, я так подозреваю, помогите разобраться, пожалуйста, ниже код файла нового поля poverka.php из system/fields

Добавлено спустя 1 минуту
  1. <?php
  2.  
  3. class fieldPoverka extends cmsFormField {
  4.  
  5. public $title = 'Дата следующей поверки';
  6. public $sql = 'TINYINT(1) UNSIGNED DEFAULT 1';
  7. public $is_virtual = true;
  8. public $allow_index = false;
  9. public $filter_type = false;
  10.  
  11. public function getOptions() {
  12. return [
  13. new fieldCheckbox('show_time', [
  14. 'title' => LANG_PARSER_DATE_SHOW_TIME,
  15. 'default' => false,
  16. 'extended_option' => true
  17. ]),
  18. new fieldCheckbox('filter_range', [
  19. 'title' => LANG_PARSER_NUMBER_FILTER_RANGE,
  20. 'default' => true
  21. ])
  22. ];
  23. }
  24.  
  25. public function getRules() {
  26.  
  27. if ($this->context === 'filter' && $this->getOption('filter_range')) {
  28. $this->rules[] = ['date_range'];
  29. } else {
  30. $this->rules[] = ['date'];
  31. }
  32.  
  33. return $this->rules;
  34. }
  35.  
  36. public function parse($value){
  37. $date = new DateTime($this->item['datapoverkiposle']);
  38. $date->add(new DateInterval('P'.$this->item['mpi'].'M'));
  39. return html_date( $date->format('Y-m-d'), $this->getOption('show_time'));
  40. }
  41.  
  42. public function getStringValue($value) {
  43.  
  44. if (!$value) { return ''; }
  45.  
  46. if (is_array($value)) {
  47.  
  48. $result_string = '';
  49.  
  50. if (!empty($value['from'])) {
  51. $result_string .= LANG_FROM . ' ' . $this->getStringValue($value['from']) . ' ';
  52. }
  53.  
  54. if (!empty($value['to'])) {
  55. $result_string .= LANG_TO . ' ' . $this->getStringValue($value['to']);
  56. }
  57.  
  58. return $result_string;
  59. }
  60.  
  61. return date(cmsConfig::get('date_format'), strtotime($value));
  62. }
  63.  
  64. public function getFilterInput($value) {
  65.  
  66. if ($this->getOption('filter_range')) {
  67.  
  68. $from = !empty($value['from']) ? date('d.m.Y', strtotime($value['from'])) : false;
  69. $to = !empty($value['to']) ? date('d.m.Y', strtotime($value['to'])) : false;
  70.  
  71. if (!$this->show_filter_input_title) {
  72. $this->title = false;
  73. }
  74.  
  75. return cmsTemplate::getInstance()->renderFormField($this->class . '_range', [
  76. 'field' => $this,
  77. 'from' => $from,
  78. 'to' => $to
  79. ]);
  80. } else {
  81. return parent::getFilterInput($value);
  82. }
  83. }
  84.  
  85. public function applyFilter($model, $value) {
  86.  
  87. if (!is_array($value) || !empty($value['date'])) {
  88.  
  89. if (!empty($value['date'])) {
  90. $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']);
  91. }
  92.  
  93. $date_start = date('Y-m-d', strtotime($value));
  94. $date_final = date('Y-m-d', strtotime($value) + 60 * 60 * 24);
  95.  
  96. return $model->filterBetween($this->name, $date_start, $date_final);
  97.  
  98. } elseif (!empty($value['from']) || !empty($value['to'])) {
  99.  
  100. if (!empty($value['from'])) {
  101. $model->filterGtEqual($this->name, date('Y-m-d', strtotime($value['from'])));
  102. }
  103. if (!empty($value['to'])) {
  104. $model->filterLtEqual($this->name, date('Y-m-d', strtotime($value['to']) + 60 * 60 * 24));
  105. }
  106.  
  107. return $model;
  108. }
  109.  
  110. return parent::applyFilter($model, $value);
  111. }
  112.  
  113. public function getDefaultVarType($is_filter = false) {
  114.  
  115. if ($this->context === 'filter') {
  116. $is_filter = true;
  117. }
  118.  
  119. if (($is_filter && $this->getOption('filter_range')) || $this->getOption('show_time')) {
  120. $this->var_type = 'array';
  121. }
  122.  
  123. return parent::getDefaultVarType($is_filter);
  124. }
  125.  
  126. public function store($value, $is_submitted, $old_value = null) {
  127.  
  128. // Если ячейка в БД начинается на date_, то cmsDatabase в prepareValue
  129. // null будет CURRENT_TIMESTAMP
  130. $default_null = strpos($this->name, 'date_') === 0 ? 0 : null;
  131.  
  132. if (!$value) { return $default_null; }
  133.  
  134. if (!is_array($value) || !empty($value['date'])) {
  135.  
  136. if (is_array($value)) {
  137. if (!empty($value['date'])) {
  138. $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']);
  139. return date('Y-m-d H:i:s', strtotime($value));
  140. }
  141. } else {
  142. return date('Y-m-d', strtotime($value));
  143. }
  144. } elseif (!empty($value['from']) || !empty($value['to'])) {
  145.  
  146. if (!empty($value['from'])) {
  147. $value['from'] = $this->store($value['from'], $is_submitted, $old_value);
  148. }
  149. if (!empty($value['to'])) {
  150. $value['to'] = $this->store($value['to'], $is_submitted, $old_value);
  151. }
  152.  
  153. return $value;
  154. }
  155.  
  156. return $default_null;
  157. }
  158.  
  159. public function storeFilter($value) {
  160. return $this->store($value, false);
  161. }
  162.  
  163. public function getInput($value) {
  164.  
  165. if ($value) {
  166. if (is_array($value)) {
  167. if (!empty($value['date'])) {
  168. $value = sprintf('%s %02d:%02d', $value['date'], $value['hours'], $value['mins']);
  169. } else {
  170. $value = null;
  171. }
  172. }
  173. }
  174.  
  175. $this->data['show_time'] = $this->getOption('show_time');
  176.  
  177. $this->data['date'] = $value ? date('d.m.Y', strtotime($value)) : '';
  178.  
  179. if ($this->data['show_time']) {
  180. if (!$value) {
  181. $this->data['hours'] = 0;
  182. $this->data['mins'] = 0;
  183. } else {
  184. list($this->data['hours'], $this->data['mins']) = explode(':', date('H:i', strtotime($value)));
  185. }
  186. $this->data['fname_date'] = $this->element_name . '[date]';
  187. $this->data['fname_hours'] = $this->element_name . '[hours]';
  188. $this->data['fname_mins'] = $this->element_name . '[mins]';
  189. } else {
  190. $this->data['fname_date'] = $this->element_name;
  191. }
  192.  
  193. return parent::getInput($value);
  194. }
  195.  
  196.  
  197.  
  198. }
  199.  
  200.  
  201.  
Добавлено спустя Только что

2. Файл шаблона poverka.tpl.php

  1. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  2. <div <?php echo html_attr_str($field->data['dom_attr']); ?>>
  3. <?php foreach ($field->data['items'] as $key => $title) { ?>
  4. <div class="custom-control custom-radio">
  5. <?php
  6. $checked = ((string) $value === (string) $key) ? 'checked' : '';
  7. $id = 'radio-'.$field->id.$key;
  8. ?>
  9. <input type="radio" <?php echo $checked; ?> id="<?php html($id); ?>" name="<?php echo $field->element_name; ?>" value="<?php html($key); ?>" class="custom-control-input">
  10. <label class="custom-control-label" for="<?php html($id); ?>">
  11. <?php echo $title; ?>
  12. </label>
  13. </div>
  14. <?php } ?>
  15. </div>
Добавлено спустя Только что

3. Файл шаблона фильтра poverka_range.tpl.php

  1. <?php $this->addTplJSNameFromContext([
  2. 'jquery-ui',
  3. 'i18n/jquery-ui/'.cmsCore::getLanguageName()
  4. ]); ?>
  5. <?php $this->addTplCSSNameFromContext('jquery-ui'); ?>
  6.  
  7. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  8.  
  9. <?php echo LANG_FROM . ' ' . html_datepicker($field->element_name.'[from]', $from, array('id' => $field->id.'_from')).' '; ?>
  10. <?php echo LANG_TO . ' ' . html_datepicker($field->element_name.'[to]', $to, array('id' => $field->id.'_to')); ?>
  11.  
#2 2 ноября 2023 в 10:08

Чтобы данные сохранялись в бд, ваши вычисления надо проводить в методе 
public function store($value, $is_submitted, $old_value = null)
А чтобы данные типа «дата» лежали в БД, структура ячейки должна иметь подходящий формат. Указанный у вас TINYINT(1) подходит лишь для чекбоксов.

#3 2 ноября 2023 в 10:49

Чтобы данные сохранялись в бд, ваши вычисления надо проводить в методе 
public function store($value, $is_submitted, $old_value = null)
А чтобы данные типа «дата» лежали в БД, структура ячейки должна иметь подходящий формат. Указанный у вас TINYINT(1) подходит лишь для чекбоксов.

Loadырь

нет знаний, чтобы это сделать

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.