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

voron121

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

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

Код: php
<?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

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

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

voron121

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

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

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

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

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

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

....

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

Septdir

  • Практически профи
  • 2277
  • 113
  • JoomlaZen
А чекед то где? Вам надо в цикле проверять если валуе этого чек бокса есть в значении поля то добавлять checked  посмотрите как у самой Joomla реализованны checkboxes
Ps список городов или регионов удобнее делать на выпадающем списке ибо можно и одно значение и мульти сделать
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты | JoomlaZen
*

fsv

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

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

voron121

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

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


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

voron121

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

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

fsv

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

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

voron121

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

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

fsv

  • Практически профи
  • 2525
  • 367
вне функции Check $formData = $this->form->getData(); возвращает массив данных а внутри функции нет
Ну так и получайте данные вне Check, затем передавайте их в Check. Что-то я никак не пойму проблему.
И вообще, вынесите свои поделки из getInput(), оставив там только return Chekboxes(), если очень хочется именно так сделать.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения
*

voron121

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

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

Код: php
  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

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

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

Код: php
class JFormFieldCity extends JFormField {
  public $private = 'Private';

public function getInput() {
    function Check(){
        echo  $private;
    }
    return Check();
}

}

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

robert

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

P.S. И включите отображение ошибок. Тут не песочница, чтобы по каждой мелочи спрашивать.
« Последнее редактирование: 10.02.2017, 22:15:41 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

fsv

  • Практически профи
  • 2525
  • 367
Код: php
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; }
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения
*

voron121

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

Код: php
<?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

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

Septdir

  • Практически профи
  • 2277
  • 113
  • JoomlaZen
при помощи функции in_array() имея на руках массив со значениями которые уже в БД и цикл с перебором всех значений решил вешать чекед на чекбокс. Не самое лучшее решение видимо но ничего лучше не  придумал пока что.  :dry:
А что в нем такого решение как решение. Вот только ты его написал странно. Накой в if и else писать поле целиком два раза. Если все что нужно это checked. Да лейбл у чекбокса куда то дел.
Да и get input в котором все что есть это возвращение другой функции выгочуядит странно. Ну это так на первый взгляд.
P.S я про чекед писал в самом начале. Да и вообще города чек боссами имхо не удобно их же не мало. Лучше мульти списком.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
________
Мои Контакты | JoomlaZen
*

voron121

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

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

Решение мое весьма странное но т.к я писал тип поля некоторое время и перепробовал массу вариантов то не исключено что код  - фигня....но работает )
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Дополнительные поля пользователя внести в письмо админу

Автор Аня

Ответов: 1
Просмотров: 59
Последний ответ 06.09.2017, 17:17:34
от Septdir
Пропала позиция на сайте, в админке она есть

Автор DIeKon

Ответов: 1
Просмотров: 40
Последний ответ 30.08.2017, 09:27:52
от DIeKon
Как изменить поля у формы редактирования профиля пользователя?

Автор ChervonStudio

Ответов: 0
Просмотров: 96
Последний ответ 13.08.2017, 18:01:16
от ChervonStudio
Не работает поиск в админке на русском

Автор WinssLioN29

Ответов: 5
Просмотров: 365
Последний ответ 17.07.2017, 17:34:30
от vipiusss
Ошибка загрузки сайта при установке русского языка в админке

Автор vipex

Ответов: 5
Просмотров: 344
Последний ответ 16.07.2017, 23:31:00
от vipex