Создание дополнительных полей тип checkbox для 2

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

Помощь в разработке дополнительных полей тип checkbox в 2-ке

#1 24 декабря 2015 в 12:11
Всем доброго времени суток уважаемые форумчане.
Возникла потребность в создании нового типа полей для контента в 2-ке чекбоксы. Думаю для многих это будет очень полезным решением.
У меня есть уже некоторые наработки.
Создал два дополнительных файла в папку system/fields/checkboxe.php
В папку templates/тема/assets/fields/checkbox.tpl.php
В файл system/libs/html.helper.php добавил новую функцию.
В админке новое поле появилось, содержимое появляется и отображается чекбоксами на сайте. Но вот никак не могу найти где ошибся в коде — не добаляет отмеченные записи в базу данных.
Ну а теперь по порядку
Содержимое файла system/fields/checkboxe.php
  1.  
  2. <?php
  3.  
  4. class fieldCheckboxe extends cmsFormField {
  5.  
  6. public $title = LANG_PARSER_Checkboxe;
  7. public $sql = 'int NULL DEFAULT NULL';
  8. public $filter_type = 'int';
  9. public $filter_hint = LANG_PARSER_Checkboxe_FILTER_HINT;
  10.  
  11. public function getOptions(){
  12. return array(
  13. new fieldCheckbox('filter_multiple', array(
  14. 'title' => LANG_PARSER_LIST_FILTER_MULTI,
  15. 'default' => false
  16. )),
  17. );
  18. }
  19.  
  20. public function getFilterInput($value) {
  21.  
  22. $items = $this->getCheckboxeItems();
  23.  
  24. if (!$this->getOption('filter_multiple')){
  25.  
  26. $items = array(''=>'') + $items;// array_pad($items, (sizeof($items)+1)*-1, '');
  27. return html_checkboxe($this->name, $items, $value);
  28.  
  29. } else {
  30.  
  31. $value = is_array($value) ? $value : array();
  32. return html_checkboxe($this->name, $items, $value);
  33.  
  34. }
  35.  
  36.  
  37. }
  38.  
  39. public function getRules() {
  40.  
  41. if($this->item){
  42. $this->rules[] = array('array_key', $this->getCheckboxeItems());
  43. }
  44.  
  45. return $this->rules;
  46.  
  47. }
  48.  
  49. public function parse($value){
  50.  
  51. $items = $this->getCheckboxeItems();
  52. $item = '';
  53.  
  54. if (isset($items[$value])) { $item = $items[$value]; }
  55.  
  56. return htmlspecialchars($item);
  57.  
  58. }
  59.  
  60. public function getCheckboxeItems(){
  61.  
  62. $items = array();
  63.  
  64. if (isset($this->items)){
  65.  
  66. $items = $this->items;
  67.  
  68. } else if (isset($this->generator)) {
  69.  
  70. $generator = $this->generator;
  71. $items = $generator($this->item);
  72.  
  73. } else if ($this->hasDefaultValue()) {
  74.  
  75. $items = $this->parseCheckboxeItems($this->getDefaultValue());
  76.  
  77. }
  78.  
  79. return $items;
  80.  
  81. }
  82.  
  83. public function parseCheckboxeItems($string){
  84. return string_explode_list($string);
  85. }
  86.  
  87. public function applyFilter($model, $value) {
  88.  
  89. if (!$this->getOption('filter_multiple')){
  90.  
  91. $model->filterEqual($this->name, $value);
  92.  
  93. } else {
  94.  
  95. if (!is_array($value)) { return $model; }
  96.  
  97. $model->filterIn($this->name, $value);
  98.  
  99. }
  100.  
  101. return $model;
  102.  
  103. }
  104.  
  105. public function getInput($value){
  106.  
  107. $this->data['items'] = $this->getCheckboxeItems();
  108.  
  109. $this->data['is_multiple'] = $this->getProperty('is_multiple');
  110. $this->data['is_tree'] = $this->getProperty('is_tree');
  111. $this->data['parent'] = $this->getProperty('parent');
  112.  
  113. $this->data['dom_attr'] = array('id'=>$this->id);
  114.  
  115. return parent::getInput($value);
  116.  
  117. }
  118.  
  119. }
  120.  
  121.  
Далее этот templates/тема/assets/fields/checkbox.tpl.php
  1.  
  2. <?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?>
  3. <?php
  4.  
  5. if($field->data['is_multiple']){
  6.  
  7. echo html_select_multiple($field->element_name, $field->data['items'], $value, $field->data['dom_attr'], $field->data['is_tree']);
  8.  
  9. }else{
  10.  
  11. echo html_checkboxe($field->element_name, $field->data['items'], $value, $field->data['dom_attr']);
  12.  
  13. }
  14.  
  15. ?>
  16.  
  17.  
  18.  
И функция в файле system/libs/html.helper.php

  1.  
  2. // Здесь много кратный чекбокс
  3.  
  4. function html_checkboxe($name, $items, $selected = '', $attributes = array(), $checked=false){
  5. // if ($checked) { $attributes['checked'] = 'checked'; }
  6. $attr_str = html_attr_str($attributes);
  7. $class = 'input-checkbox';
  8. if (isset($attributes['class'])) { $class .= ' '.$attributes['class']; }
  9. // $html = '<select name="'.$name.'" '.$attr_str.$class.'>'."\n";
  10.  
  11. $optgroup = false;
  12. $checked = is_array($selected) && in_array($value, $selected);
  13. if($items && is_array($items)){
  14. foreach($items as $value => $title){
  15.  
  16. if(is_array($title)){
  17. if($optgroup !== false){
  18. $html .= "\t".'</optgroup>'."/n";
  19. $optgroup = false;
  20. }
  21. $optgroup = true;
  22. $html .= "\t".'<optgroup label="'.$title[0].'">'."\n";
  23. continue;
  24. }
  25.  
  26. $sel = ((string) $selected === (string) $value) ? 'checked' : '';
  27. //$html .= "\t".'<option value="'.htmlspecialchars($value).'" '.$sel.'>'.htmlspecialchars($title).'</option>'."\n";
  28. $html .= "\t".'<input type="checkbox" class="'.$class.'" name="'
#2 24 декабря 2015 в 12:16
VonKruger, Замените это
  1. public $title = LANG_PARSER_Checkboxe;
  2. public $sql = 'int NULL DEFAULT NULL';
  3. public $filter_type = 'int';
  4. public $filter_hint = LANG_PARSER_Checkboxe_FILTER_HINT;
на это
  1. public $title = LANG_PARSER_Checkboxe;
  2. public $sql = 'varchar(64) NULL DEFAULT NULL';
  3. public $filter_type = 'str';
  4. public $filter_hint = LANG_PARSER_Checkboxe_FILTER_HINT;
так как вы наверняка передаёте в БД не число (int), а нечто другое.
#3 24 декабря 2015 в 12:48
Здесь все правильно передается число и в базе хранится числом а зничение идентификатора потом выводится на сайте — если ввести вручную в базу данных.
Где-то я напартачил и никак не разберусь. Больше года уже не занимался программированием, были на то обстоятельства и маленько подзабылось уже.
#4 24 декабря 2015 в 12:52
Вот вид исходника
Вот сам вид чекбоксов
#5 24 декабря 2015 в 13:35
VonKruger, я вам про то значение, что заносится в БД, а вы мне про то значение, что выводится в шаблоне.
У вас когда вы выбераете чекбоксы — один, три, пять, значение поля checkboxe, чему будет равно? Одной цифре или набору цифр?
#6 24 декабря 2015 в 14:08
Одна или набор в зависимоти от выбора. Я так уже менял причина не в этом где-то еще

А в скрнах я визуально показал как это выглядит в исходнике, что в value идет цифра
#7 24 декабря 2015 в 15:15
Записать получилось
Вот что получается

Теперь нужно его распарсить и вывести вот в этом коде
  1.  
  2. public function parse($value){
  3.  
  4. $items = $this->getCheckboxeItems();
  5. $item = '';
  6.  
  7. if (isset($items[$value])) { $item = $items[$value]; }
  8.  
  9. return htmlspecialchars($item);
  10.  
  11. }
  12.  
#8 24 декабря 2015 в 16:09
Все решил проблему.
Так всегда как что-то не получается мучаешься и не получается, создал тему на форуме и получилось.
Всем спасибо за внимание.
Кому нужно данное решение обращайтесь в личку.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.