Форум русской поддержки Joomla!® CMS
16.08.2017, 19:23:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Основной курс по Joomla
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Свой тип поля в админке - не подхватеывает выбранные значения

 (Прочитано 301 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« : 07.02.2017, 02:30:59 »

Доброго времени суток уважаемые форумчане. Прошу помощи т.к сам зашел в тупик.  Мне потребовался свой тип поля для компонента в админке Joomla ^ список регионов РФ и ниже чекбоксы с городами. То есть администратор может выбрать 1 и более городов для той или иной записи.

Я создал свой тип поля :  в папке models создал папку field с файликом в котором вот такое содержимое :

Код
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');
jimport('joomla.form.formfield');
 
class JFormFieldCity extends JFormField {
 protected $type = 'City';
 public function getInput() {
  // получаем список городов где ключем будет ид региона
    function CitysList($id){
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('`#__cities`');
       $query->where('region_id = ' .$id);
       $query->order('name_ru ASC');
       $db->setQuery($query,0,100);
       $list = $db->loadRowList();
       $city = "";
       foreach ($list as $key) {
           $city .= '<div><input name="jform[regions][]"  type="checkbox" value="'.$key['0'].'">'.$key['2'].'</div>';
       }
       return $city;
    }
    // формируем список регионов с списокм городов региона
    function Chekboxes(){
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('`#__regions`');
       $query->where('country = "RU"');
       $query->order('name_ru ASC');
       $db->setQuery($query,0,100);
       $list = $db->loadRowList();
 
       foreach ($list as $key) {
           echo "<hr>".$key['3'].":<br>";
           echo CitysList($key['0']);
       }
    }
    return Chekboxes();
   }
}
 
 

Вывел в админке в компоненте - отработал как нужно. Попробовал сохранить -  в бд, в нужной ячейке записи ушли. Тут тоже все хорошо. НО если открыть запись на редактирование то в моем поле не выбранны те чекбоксы, параметры которых уже есть в бд у записи. То есть список с чекбоксами не отмечен ничем.

Прошу помощи - как мне решить траблу: что бы при редактировании записи мой тип полей подхватывал уже выбранные ему данные из БД ?

PS:
Сильно палками прошу не бить. Я знаю что это не совсем правильно но пока что  я не знаю как не создавая запрос в бд в каждой итерации цикла с регионами, что бы вывести чекбоксы
Записан
fsv
Практически профи
*******

Репутация: +368/-2
Offline Offline

Пол: Мужской
Сообщений: 2553


« Ответ #1 : 07.02.2017, 02:58:36 »

В функции еще 2 функции... Почему бы вам не почитать доки и не посмотреть, как реализованы другие поля?

Цитировать
как мне решить траблу: что бы при редактировании записи мой тип полей подхватывал уже выбранные ему данные из БД ?
Код
protected function getInput()
{
   // Get the form data
   $formData = $this->form->getData();
посмотрите, что в $formData , используйте для того, чтобы чекнуть соответствующие чекбоксы
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #2 : 07.02.2017, 04:01:18 »

В функции еще 2 функции... Почему бы вам не почитать доки и не посмотреть, как реализованы другие поля?

Дело в том что для моих нужд я не нашел примера реализации данной задачи. Честно говоря инфы по кастомым полям не много и все примеры очень простые. Я думал получить двумерный массив  : сделать Join запрос в бд для того что бы одним запросом выбрать и регионы и города, но честно говоря сильно втупился в то что не могу в цикле вывести записи в формате :

Название региона

 город региона
 город региона
 город региона

Название региона 2

 город региона 2

....

Самому стыдно, понимаю что задача далеко не самая сложная, но  вот ступор и все. С функциями пока что сделал для понимания того как это будет работать . И к тем функциям сейчас думаю написать функцию - проверки - что то типа если в городах есть город с ид поля - чекаем, иначе нет. Понимаю что творю какую то х*ю, но что еще поделать. Нет инфы, не скем посоветоваться, доки  хорошие но многое в них не ясно
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Offline Offline

Пол: Мужской
Сообщений: 2110



« Ответ #3 : 07.02.2017, 11:54:40 »

А чекед то где? Вам надо в цикле проверять если валуе этого чек бокса есть в значении поля то добавлять checked  посмотрите как у самой Joomla реализованны checkboxes
Ps список городов или регионов удобнее делать на выпадающем списке ибо можно и одно значение и мульти сделать
Записан
fsv
Практически профи
*******

Репутация: +368/-2
Offline Offline

Пол: Мужской
Сообщений: 2553


« Ответ #4 : 07.02.2017, 15:14:41 »

Цитировать
Мне потребовался свой тип поля для компонента в админке Joomla ^ список регионов РФ и ниже чекбоксы с городами.
То есть администратор может выбрать 1 и более городов для той или иной записи.
А при этом выбранные города могут относится только к 1 региону? Или надо дать возможность выбора для "записи" городов в нескольких регионах?

Если только в 1 регионе, вам надо делать 2 разных кастомных поля, связанных:
1) регионы, выпадающим списком, полно примеров;
2) города в регионе:
  а) загрузка: если в $formData есть id региона (поле п.1), то получить и вывести города региона;
  б) добавить js, который по change региона аяксом будет получать и выводить их новую пачку
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #5 : 10.02.2017, 01:21:06 »

А при этом выбранные города могут относится только к 1 региону? Или надо дать возможность выбора для "записи" городов в нескольких регионах?

Если только в 1 регионе, вам надо делать 2 разных кастомных поля, связанных:
1) регионы, выпадающим списком, полно примеров;
2) города в регионе:
  а) загрузка: если в $formData есть id региона (поле п.1), то получить и вывести города региона;
  б) добавить js, который по change региона аяксом будет получать и выводить их новую пачку


Столь сложная струтура мне не нужна. Грубо говоря просто дерево городов разделенные регионами. При клике на регион ничего не происходит. Администратор будет выбирать только города .... хотя выделить все города при клике на регион - идея не плохая, может быть заморочусь Azn
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #6 : 10.02.2017, 01:24:05 »

В функции еще 2 функции... Почему бы вам не почитать доки и не посмотреть, как реализованы другие поля?
Код
protected function getInput()
{
   // Get the form data
   $formData = $this->form->getData();
посмотрите, что в $formData , используйте для того, чтобы чекнуть соответствующие чекбоксы

Примерно так и решил сделать но столкнулся с весьма глупой траблой : я не могу понять как мне обратиться к $formData = $this->form->getData(); внутри функции. То есть идея такова (собственно по сути то что вы и описали) - в цикле вывода городов буду проверять есть или нет ид города . Но если я вызываю данные внутри функции getInput - то я их могу вернуть. Если же я делаю это внутри свойе функции, к примеру внутри функции Citys - то ничего не получается. Знаю что туплю не знаю где туплю
Записан
fsv
Практически профи
*******

Репутация: +368/-2
Offline Offline

Пол: Мужской
Сообщений: 2553


« Ответ #7 : 10.02.2017, 01:38:47 »

Цитировать
Столь сложная струтура мне не нужна.
Как по мне, то это более простая.

Цитировать
я не могу понять как мне обратиться к $formData = $this->form->getData(); внутри функции.
Не совсем понял проблему и то, что написано дальше. Но кто мешает данные формы получать в одной функции и передавать их для проверки в другую?
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #8 : 10.02.2017, 01:45:41 »

Как по мне, то это более простая.
Не совсем понял проблему и то, что написано дальше. Но кто мешает данные формы получать в одной функции и передавать их для проверки в другую?

так и думаю сделать. Но если я в функции Check пробую написать $formData = $this->form->getData(); то  переменная formdata не вернет ничего и будет ошибка на то что я использую метод This в функции без объекта (вроде бы такой текст). То есть вне функции Check $formData = $this->form->getData(); возвращает массив данных а внутри функции нет
Записан
fsv
Практически профи
*******

Репутация: +368/-2
Offline Offline

Пол: Мужской
Сообщений: 2553


« Ответ #9 : 10.02.2017, 04:29:07 »

вне функции Check $formData = $this->form->getData(); возвращает массив данных а внутри функции нет
Ну так и получайте данные вне Check, затем передавайте их в Check. Что-то я никак не пойму проблему.
И вообще, вынесите свои поделки из getInput(), оставив там только return Chekboxes(), если очень хочется именно так сделать.
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #10 : 10.02.2017, 05:31:33 »

И вообще, вынесите свои поделки из getInput(), оставив там только return Chekboxes(), если очень хочется именно так сделать.

Спс, сделаю ) Что то сразу не подумал. А на счет траблы : вот смотрите, вот пример кода

Код
  public function getInput() {
 
   $formData = $this->form->getData();
   $regions_array = $formData['regions'];
 
       function Check(){
       // пример
        global $regions_array;
        return $regions_array;
       }
...
}
 

$regions_array - это массив с данными, но если я обращаюсь к этой переменной в функции Check() то при проверке что она мне отдает var_dump() пишет Null - тоесть функция не отдает данные. НО почему так ?? Я не могу понят почему переменная $regions_array отдает NULL когда она должна быть видима вне функции
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #11 : 10.02.2017, 06:34:24 »

И вообще, вынесите свои поделки из getInput(), оставив там только return Chekboxes(), если очень хочется именно так сделать.

честно говоря уже мозг сломал и не могу понять : то что вы советуете верно но я не могу получить доступ к переменным вне функции. Вот пример набросал

Код
class JFormFieldCity extends JFormField {
 public $private = 'Private';
 
public function getInput() {
   function Check(){
       echo  $private;
   }
   return Check();
}
 
}
 

По идее переменная private видима везде и должно вернуть ее а нет - пишет что переменная не распознанна. И все тут. Вот как то так.
Записан
robert
Профи
********

Репутация: +384/-15
Offline Offline

Пол: Мужской
Сообщений: 4213


« Ответ #12 : 10.02.2017, 10:43:27 »

Потому что функция Check не находится в контексте объекта JFormFieldCity. Придется его вызывать:
Код
public function getInput() {
   function Check(){
$city = new JFormFieldCity();
       echo  $city->private;
   }
   return Check();
}
 
П*ц, где вы научились так писать код? Зачем вставлять фунцию в другую функию, когда функции находятся внутри класса?

P.S. И включите отображение ошибок. Тут не песочница, чтобы по каждой мелочи спрашивать.
« Последнее редактирование: 10.02.2017, 23:15:41 от robert » Записан
fsv
Практически профи
*******

Репутация: +368/-2
Offline Offline

Пол: Мужской
Сообщений: 2553


« Ответ #13 : 10.02.2017, 15:03:26 »

Код
protected function getInput()
{
   $formData = $this->form->getData();
   return $this->Check($formData['regions']);
}
 
private function Check($regions)
{
   return $regions;
}

Насчет варианта с переменной.
По идее переменная private видима везде и должно вернуть ее а нет - пишет что переменная не распознанна.
В начале класса: protected $private = null;
В функции: $this->private = '12345';
В др.функции: if( $this->private){ echo  $this->private; }
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #14 : 11.02.2017, 01:53:44 »

в общем решилось и свершилось. Начал думать головой - начало получаться лучше Azn Спасибо всем кто давал советы - это помогло и очень сильно. В целом же решил все вот так вот :

Код
<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');
jimport('joomla.form.formfield');
 
class JFormFieldCity extends JFormField {
protected $type = 'City';
 
   // список городов по ид региона
   private function CitysList($id){
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('`#__cities`');
       $query->where('region_id = ' .$id);
       $query->order('name_ru ASC');
       $db->setQuery($query,0,10);
       $list = $db->loadRowList();
       $city = "";
       $formData = $this->form->getData();
        foreach ($list as $key) {
              if (in_array($key['0'], $formData['regions'])) {
                   $city .= '<div><input name="jform[regions][]"  type="checkbox" value="'.$key['0'].'" checked>'.$key['2'].'</div>';
               }else {
                   $city .= '<div><input name="jform[regions][]"  type="checkbox" value="'.$key['0'].'">'.$key['2'].' НЕТ</div>';
               }
           }
       return $city;
   }
   // формируем список регионов с список городов региона
   private  function Chekboxes(){
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('`#__regions`');
       $query->where('country = "RU"');
       $query->order('name_ru ASC');
       $db->setQuery($query,0,400);
       $list = $db->loadRowList();
       foreach ($list as $key) {
           echo "<hr>".$key['3'].":";
           echo $this->CitysList($key['0']);
       }
   }
 
   protected function getInput(){
       return $this->Chekboxes();
   }
}
 
 

при помощи функции in_array() имея на руках массив со значениями которые уже в БД и цикл с перебором всех значений решил вешать чекед на чекбокс. Не самое лучшее решение видимо но ничего лучше не  придумал пока что.  dry
Записан
robert
Профи
********

Репутация: +384/-15
Offline Offline

Пол: Мужской
Сообщений: 4213


« Ответ #15 : 11.02.2017, 11:51:02 »

1. Почему бы вам не испольовать метод loadObjectList? Вместо безликой $key['0'] получите понятную $key->id, к тому же объект обладает большей возможностью.
2. Чтобы ижбежать in_array, можно внутри запроса выбрать виртуальный столбец checked, например, с значением checked="checked" или пустой и сразу выводить его как аттрибут. Экономия не столь очевидна, но удобство на лицо.
3. При каждом обращении к странице генерируется 401 запрос и в каждом регионе все равно выводятся только 10 городов. Это же какая нагрузка будет? Почему не вывести только список регионов, а города - уже при конкретном выборе региона?
Записан
Septdir
Практически профи
*******

Репутация: +106/-0
Offline Offline

Пол: Мужской
Сообщений: 2110



« Ответ #16 : 11.02.2017, 11:57:00 »

при помощи функции in_array() имея на руках массив со значениями которые уже в БД и цикл с перебором всех значений решил вешать чекед на чекбокс. Не самое лучшее решение видимо но ничего лучше не  придумал пока что.  dry
А что в нем такого решение как решение. Вот только ты его написал странно. Накой в if и else писать поле целиком два раза. Если все что нужно это checked. Да лейбл у чекбокса куда то дел.
Да и get input в котором все что есть это возвращение другой функции выгочуядит странно. Ну это так на первый взгляд.
P.S я про чекед писал в самом начале. Да и вообще города чек боссами имхо не удобно их же не мало. Лучше мульти списком.
Записан
voron121
Давно я тут
****

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 222


Метод тыка и мата помогает в кодинге


« Ответ #17 : 13.02.2017, 00:14:44 »

Цитировать
P.S я про чекед писал в самом начале. Да и вообще города чек боссами имхо не удобно их же не мало. Лучше мульти списком.

Я знаю ) Это натолкнуло меня на понимание как должно быть. Я почему то предполагал что Joomla сама подхватит значения. Мультиселект  - вариант но мне нужны именно чекбоксы Sad

Решение мое весьма странное но т.к я писал тип поля некоторое время и перепробовал массу вариантов то не исключено что код  - фигня....но работает )
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet