Новости Joomla

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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Доброго времени суток уважаемые форумчане. Прошу помощи т.к сам зашел в тупик.  Мне потребовался свой тип поля для компонента в админке 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

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

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

voron121

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

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

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

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

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

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

....

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

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
А чекед то где? Вам надо в цикле проверять если валуе этого чек бокса есть в значении поля то добавлять checked  посмотрите как у самой Joomla реализованны checkboxes
Ps список городов или регионов удобнее делать на выпадающем списке ибо можно и одно значение и мульти сделать
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

fsv

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

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

voron121

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

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


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

voron121

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

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

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Цитировать
Столь сложная струтура мне не нужна.
Как по мне, то это более простая.

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

voron121

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

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

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
вне функции Check $formData = $this->form->getData(); возвращает массив данных а внутри функции нет
Ну так и получайте данные вне Check, затем передавайте их в Check. Что-то я никак не пойму проблему.
И вообще, вынесите свои поделки из getInput(), оставив там только return Chekboxes(), если очень хочется именно так сделать.
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
И вообще, вынесите свои поделки из 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

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

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

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

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

}

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Потому что функция 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 »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

fsv

  • Живу я здесь
  • 2765
  • 402 / 2
Код: 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; }
Веб-разработка: заказ. Только новая объемная разработка. Качественно, дорого.
*

voron121

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

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

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

Septdir

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

voron121

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

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

Решение мое весьма странное но т.к я писал тип поля некоторое время и перепробовал массу вариантов то не исключено что код  - фигня....но работает )
*

alexy.74

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
У меня пара вопросов
1) у меня $formData объект, а у вас массив
2)при попытке извлечь свойство из  $formData выдает ошибку
Код
Cannot access protected property Joomla\Registry\Registry::$data
Вот код объекта
Код
Joomla\Registry\Registry Object ( [data:protected] => 
stdClass Object ( [id] => 142 [asset_id] => 590 [title] => Сортировка по пакетам [note] => [content] => [ordering] => 1 [position] => [publish_up] => 0000-00-00 00:00:00 [publish_down] => 0000-00-00 00:00:00 [published] => 1 [module] => mod_channels [access] => 1 [showtitle] => 1 [params] => stdClass Object ( [fieldzagolovok] => Сортировка по пакетам [fieldclass] => [fieldpaket] => 6 [paket] => НТВ-Плюс [fieldcategori] => 2 [showimages] => 1 [black_white] => black_white [module_tag] => div [bootstrap_size] => 0 [header_tag] => h3 [header_class] => [style] => 0 ) [client_id] => 0 [language] => * [assigned] => Array ( [0] => 0 ) [assignment] => 0 ) [initialized:protected] => [separator] => . )
*

NewUsers

  • Живу я здесь
  • 2307
  • 215 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Код: php
<?= $this->form->getValue('id') ?>
Занимаюсь создание расширений для Joomla 3.10.x и 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Работа с DOM деревом на PHP
*

alexy.74

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Код: php
<?= $this->form->getValue('id')?>
Делал такой вариант.
Вот код
Код
	$formData = $this->form->getValue('fieldpaket');
print_r($formData);
Пусто в ответе
(я не ошибаюсь: fieldpaket - это имя поля в xml файле?)
*

alexy.74

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Разобрался! Спасибо!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод дополнительного поля материала в модуле

Автор timofe

Ответов: 10
Просмотров: 1509
Последний ответ 06.10.2023, 14:02:24
от Mitriy
Затроились все записи в админке Joomla 3.10

Автор rimm

Ответов: 7
Просмотров: 470
Последний ответ 17.04.2023, 12:41:58
от sivers
Заменить текст - просмотров - на иконку (или свой текст)

Автор all_zer

Ответов: 2
Просмотров: 313
Последний ответ 28.03.2023, 13:32:35
от all_zer
Вывести поля профиля Joomla

Автор romagromov

Ответов: 9
Просмотров: 596
Последний ответ 09.12.2022, 08:43:08
от sivers
Добавление поля в форму регистрации

Автор Robert24

Ответов: 3
Просмотров: 444
Последний ответ 10.10.2022, 23:35:04
от Robert24