Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 11 Ответов
  • 5388 Просмотров
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
кто-нибудь сталкивался с багом checkbox в Joomla 2.5.6?

в настройках (! пустого) темплейта используется только cheсkbox (все остальное выдрано для чистоты эксперимента)
после сохранения настроек темплейта в админке и повторного их открытия значение cheсkbox остается не измененным (менять его бесполезно оно не сохраняется)

методом вывода значений value и checked алертом на OnClick и другие события удалось выяснить что значение cheсkbox меняется в поле checked а поле value остается неизменным... в тоже время (как я понимаю) обработка движком Joomla строится на поле value, то есть из-за этого походу и не пашет сейв значения checkbox.

попытка ручного фикса - присвоения  value=checked на onClick - ломает значение для выхода из настроек без сохранения...

xml:
   <config>
      <fields name="params">
         <fieldset name="basic">
               <field name="eq1" type="checkbox" checked="checked" label="Одинаковая ширина колонок" />
         </fieldset>
      </fields>
   </config>

кто-нибудь еще сталкивался с этой проблемой?

*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
Цитировать
<field name="eq1" value="1" type="checkbox" checked="checked" label="Одинаковая ширина колонок" />
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
не помогло

Код
Стиль успешно сохранён

убранная с checkbox галка - самостоятельно выставилась обратно.
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
убрала ) эффект тот же.

мне всегда казалось что наличие в XML записи о дефолтном(!) значении любого поля никак не должно сказываться на работоспособности ГРАМОТНО ПРОПИСАННОГО класса в целом. так или иначе в классе JFormField в \Joomla_2.5.6-Stable-Full_Package\libraries\joomla\form\field.php в public function __get($name) предусмотрена обработка значения value но не предусмотрена обработка checked. класс checkbox является наследником JFormField. Тоесть он или использует метод описаный у папаньки или должен иметь свой переписаный вариант но в \Joomla_2.5.6-Stable-Full_Package\libraries\joomla\form\fields\checkbox.php переписан только getInput()... который кстати выводит и поле value и поле checked.
причем значения берет очень странно:
Код
$checked = ((string) $this->element['value'] == $this->value)? ' checked="checked"' : '';
Код
' value="' . htmlspecialchars((string) $this->element['value'], ENT_COMPAT, 'UTF-8'). '"'
cheсked вычисляется из value как я понимаю...
а как я уже писала в первом посте при анализе работы результирующего кода (страницы в браузере) значение value НЕ МЕНЯЕТСЯ... в тоже время меняется значение checked

я пробовала прописать собственный класс на базе checkbox в котором пробовала много разных вариантов в том числе переписывала функцию __get добавив обработку checked, пробовала модифицировать обработку value. 
пока мне не удалось решить эту проблему.
к сожалению я не разбираюсь в движке Joomla настолько чтоб точно отследить где именно происходит обработка параметра value для класса checkbox.

смотрела чужие темплейты использующие переключение - разработчики используют радиобутоны или лист с выбором "да"\"нет" что согласись извращение при наличии checkbox

неохота изобретать велосипед или по неграмотности пхать самопальные костыли в бочину темплейту... надеюсь есть адекватное объяснение что я делаю не так или как это грамотно пофиксить.

смотрела исходные коды сборки Joomla 3.0 альфа-1 ... судя по коменту с верху файла с описанием указанных классов используется код из 11.1 платформы, то есть скорее всего баг будет тот же. пойду инстолять и тестить.
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
хз у меня все работало не в шаблоне правда, а в модуле вроде. В принципе тут без разницы, обработка одна идет. Значит что-то не так делаете.
Если параметры шаблона, то отследить можно в БД таблица '_template_styles' поле 'params' там в формате json они записываются.
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
ну мне сложно что то делать не так :
1) ставлю чистую пустую Joomla 3 (или 2.6.5)
2) загоняю туда пустой темплейт с единственной рабочей строкой в xml
Код
<field name="eq1" value="1" type="checkbox" label="текст" />
3) захожу в админку, открываю настройки темплейта
4) снимаю галку с чекбокса, жму кнопку сохранить настройки темплейта
5) вижу как галочка выставляется обратно сама.

баг как говорится на лицо.
тестировано в Firefox последнем и IE (чисто из паранойи, так сказать, браузер тут как бы не при чем =) )

p.s. базу тож посмотрела - значение после попытки сохранить со снятой галочкой - {"eq1":"1"}
=> явные косяки в коде Joomla.
« Последнее редактирование: 08.08.2012, 13:27:58 от onehero »
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
ради любопытства проверил на стандартном шаблоне Beez2 - Parks Site.
Все работает как надо - значение либо есть либо его нету)
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
нулевая установленная для этого теста Joomla.
сделанный для теста шаблон с 1 единственной строчкой в xml 
коммерческий хостинг
...
оценив затраты времени убитого на поиск решения проблемы переписала код на list-ах. 
Большое спасибо SmokerMan за время потраченное на попытки помочь мне и + в репутацию отзывчивому человеку.
*

onehero

  • Осваиваюсь на форуме
  • 16
  • 2 / 0
Оказывается вот где собака зарылась :)

Цитировать
Синхронизация свойств и атрибутов...
 Синхронизация не гарантирует одинакового значения...
Есть и другие свойства-атрибуты, которые не копируются в точности. Например, таково свойство input.checked:
   
1   <input type="checkbox" checked>
2   
3   <script>
4     var input  = document.body.children[0];
5   
6     alert( input.checked ); // true <-- может быть только true/false
7   
8     alert( input.getAttribute('checked') ); // пустая строка
9   </script>

полностью читать тут http://learn.javascript.ru/attributes-and-custom-properties
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
Так Вы нашли способ решить проблему или нет?

Просто нарвался на тоже самое по сути. Бьюсь уже долго, но пока безрезультатно.
Checkbox прописан в форме XML файла. Все значения из других полей сохраняются в базе, кроме checkbox.
Причем у меня при некоторых настройках полей value и checked в таблицу базы начинает сохраняться установка, но снятие checkbox не хочет сохраняться ни в какую.

P.S.: Кстати тоже заметил что checkbox как то нигде не используется в компонентах Joomla. Даже код негде посмотреть  :P
« Последнее редактирование: 24.11.2012, 22:38:34 от rsa_m »
*

rsa_m

  • Захожу иногда
  • 254
  • 22 / 0
В общем разобрался с горем пополам с траблом. И сделал так чтобы у меня заработало. Правда с шаманскими обрядами, бубном и работает не совсем прозрачно для понимания, но работает  :D

Трабл.
Оказывается (по крайней мере знающие люди мне сказали так) что каждый кто занимается HTML наступает на эти грабли.
Того кто это придумал нужно повесить на столбе наверное, но сделано так, что элемент checkbox в форме шлет свое значение в POST только если установлен. А если не установлен, то в POST о нем вообще ничего не будет передано, даже его имя.
Ну и разумеется Joomla то в таблицу сохраняет значения только разбирая POST. А раз там name checkbox нет, то в базу и ни чего нового не сохраняется.

Таким образом установить checkbox можно и значение запишется в базу, а снять его уже нельзя.

Теперь как я лечил для админ части компонента. До конца сам не понимаю пока механизм, но работает.
1. В XML файл пишем
Код
<field
         name="lic"
         type="checkbox"
         label="lic"
         description="lic"
      />
value и default прописывать нельзя иначе все рушится.
lic - меняем на свое название

2. В <название компонента>/tables в класс JTable PHP файла пишем:
Код
   public function bind($array, $ignore = '')
   {
      if (!isset($array['lic'])){
         $array['lic'] = '0';
      }
     
      return parent::bind($array, $ignore);
   }
lic - меняем на свое название

После этого в таблицу начинают сохраняться значения и в форме checkbox устанавливается правильно при чтении из таблицы.
При этом в таблицу пишутся значения:
0 - если checkbox не установлен
поле пустое - если checkbox установлен.

P.S.: Конечно хотелось бы чтобы значения в таблицу писались 0 и 1 соответственно для снятого и установленного checkbox. Но увы, сколько Я не бился - такого результата достичь не смог.
Хотя казалось бы проинвертируй - напиши
Код
 if (isset($array['lic'])){
         $array['lic'] = '1';
      }
и все заработает. Но не работает  :o
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться