Связать два списка в админке

  • 44 Ответов
  • 1402 Просмотров

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

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Компонент, админская часть. Во вьюхе выводится два поля типа list с выборкой данных из базы через поле-потомок JFormFieldList.
Одно поле просто выводит список из таблицы, второе поле должно выводить список по условию, где значение условия равно текущему значению первого поля.
Т.е. по сути нужен master-detail в рамках двух JFormFieldList. Имеются ли готовые примеры, дабы свой велосипед не изобретать? Боюсь, у меня на очередное изобретение опять времени уйдет...

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #1 : 18.02.2015, 18:16:31 »
Это связанные поля, либо писать один контрол с кучей скриптов (в котором будут выводится два связанных поля)
Либо второе дергать аяксом!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #2 : 18.02.2015, 18:21:46 »
Упс, не все так просто в 3/9 королевстве, как это может показаться из 3/10... Вечно у меня задачки типа "как поковыряться в левой ноздре мизинцем правой пятки" ( :) )

Тема аякса все более интересна становится. Особенно его использование в админке. Вы такое делали?
« Последнее редактирование: 18.02.2015, 18:27:16 от AlekVolsk »

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #3 : 18.02.2015, 18:29:23 »
Вы такое делали?
Естественно... все очень просто (если у вас свой компонент, а у вас 100% свой компонент )
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #4 : 18.02.2015, 18:34:56 »
Да, 100% свой компонент, J3.last.
Правильно ли понял: на первый список вешаем onchange js => в котором вызываем аякс-функцию => делаем выборку для второго списка = > результат возвращаем во вьюху => присваиваем второму списку результат выборки из аякс-функции. 2 последних шага чего-то в ступор вводят немного.

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #5 : 18.02.2015, 19:32:46 »
При смене первого селект стучимся куда то аяксом, возвращаем в результате дргой селект и ложим его в нужный нам блок
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #6 : 18.02.2015, 19:36:13 »
возвращаем в результате дргой селект
Сформировываем готовый HTML?

Посмотрел разметку. Вывод раскрывающегося списка на bs2 - жесть. А если шаблон админки у конечного будет другой, не на bs2?
« Последнее редактирование: 18.02.2015, 19:46:51 от AlekVolsk »

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #7 : 18.02.2015, 21:30:14 »
Сформировываем готовый HTML?
Да ) Почему бы нет?)

Посмотрел разметку. Вывод раскрывающегося списка на bs2 - жесть. А если шаблон админки у конечного будет другой, не на bs2?
не совсем понял про какой вы список говорите
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #8 : 18.02.2015, 21:53:34 »
не совсем понял про какой вы список говорите
http://www.floomby.ru/s2/Ye3Dad
обычный список, выводимый посредством echo $this->form->getInput('fieldname'); описанный в XML как type="list" с кучей options

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #9 : 18.02.2015, 23:20:48 »
обычный список, выводимый посредством echo $this->form->getInput('fieldname'); описанный в XML как type="list" с кучей options
Так то же скриптом херачится ) Вам не нужно ничего делать! Просто подрубить нужный скрипт:
Код: php
<?php JHtml::_( 'formbehavior.chosen', 'select' ); ?>
И все, не нужно будет что то править!

Вот например на этом сайте так делал: http://stroykanews.com/katalog.html
Код: php
jQuery(document).ready(function ($) {
$('#region').on('change', function () {
$.get('index.php?option=com_organisations&task=getCityListSite&region=' + $(this).val(), function (response) {
$('.city-block').html(response);
$('select').chosen({width: '200px'}); // это применяем скрипт для стилизации вновь загруженного селекта
});
});
})
Второй селект лежит в блоке <div class="city-block"></div>
AJAX мне возвращает:
<select>
<option value="...">...</option>
...
</select>

А список городов формирую банально  в контроллере

Код: php
public function getCityListSite()
{
$options = array();
// получаем данные  //
echo JHtml::_( 'select.genericlist', $options, 'jform[city]', 'class="input-text width-200"' );
exit;
}

Главное в XML файле формы добавить это поле
Код: xml
<field name="city" type="list" label=""></field>
И его можно вывести с какими то базовыми данными...
« Последнее редактирование: 18.02.2015, 23:29:56 от Istaan »
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #10 : 18.02.2015, 23:24:15 »
Спс, пробую.

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #11 : 19.02.2015, 01:02:44 »
Что имею в начале: http://www.floomby.ru/s2/je3sjx

При попытке изменения партнера получаю: http://www.floomby.ru/s2/7e3scs (все select'ы на странице продублированы, вместо второго селекта из задействованной пары выводится вьюха компонента по-умолчанию).

Скрипт в шаблоне вьюхи:
Спойлер
[свернуть]

Поля в шаблоне вьюхи выводятся так:
Спойлер
[свернуть]

Аякс-модель:
Спойлер
[свернуть]

В контроллере, связанной с данной вьюхой:
Спойлер
[свернуть]

Задействованная пара полей в xml:
Спойлер
[свернуть]

Где я лопух?
« Последнее редактирование: 19.02.2015, 01:06:51 от AlekVolsk »

*

robert

  • Профи
  • ********
  • 4002
  • 371
Re: Связать два списка в админке
« Ответ #12 : 19.02.2015, 01:12:30 »
AlekVolsk, AJAX - удобная штука и совсем не сложная. В вашем случае все примерно так выглядит:
- выбираете значение select и заодно отправляете форму обработчику,
- обрабочик принимает параметр, обрабатывает и выдает HTML-код (хотя может быть другие форматы: JSON, XML...)
- HTML-код выводится на стрнанице.
Только все это происходит без перезагрузки страницы.

P.S. Ooops, не видел ваш последний пост.
« Последнее редактирование: 19.02.2015, 01:15:56 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #13 : 19.02.2015, 01:17:58 »
P.S. Ooops, не видел ваш последний пост.
В том-то вся и фишка... До этого уже много чего на аяксе наваял, просто с мастер-детайл впервые столкнулся на нем, чего-то опять недогоняю

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #14 : 19.02.2015, 01:28:05 »
Поменял $('.partsite').html(response); на alert(response); посмотрел, что выводит - там полная html-страница. Что-то в аякс-модели не так?

*

zomby6888

  • Живу я здесь
  • ******
  • 1484
  • 167
Re: Связать два списка в админке
« Ответ #15 : 19.02.2015, 01:31:32 »
добавьте exit; в методе контроллера, он у Вас скорее всего весь шаблон тащит. А может ошибку отдает. Ответ аякса лучше в консоль выводить и там мониторить а не алертом.
« Последнее редактирование: 19.02.2015, 01:36:39 от zomby6888 »
интернет-блог: http://websiteprog.ru

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #16 : 19.02.2015, 01:36:41 »
Он там есть:
Код: php
  public function getListSites()
  {
    $options = array();
    echo JHtml::_('select.genericlist', $options, 'jform[partsite]', '' );
    exit;
  }

*

robert

  • Профи
  • ********
  • 4002
  • 371
Re: Связать два списка в админке
« Ответ #17 : 19.02.2015, 01:38:02 »
посмотрел, что выводит - там полная html-страница.
Именно та страница?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #18 : 19.02.2015, 01:42:38 »
нет, просто вьюха по умолчанию этого-же компонента, полностью вся страница админки
селекты в другой вьюхе

возвращаю из аякс-модели $result (результат запроса), $id (получаю из реквеста) - на выходе одно и тоже
« Последнее редактирование: 19.02.2015, 01:45:43 от AlekVolsk »

*

robert

  • Профи
  • ********
  • 4002
  • 371
Re: Связать два списка в админке
« Ответ #19 : 19.02.2015, 01:47:54 »
С контроллером не ладно.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #20 : 19.02.2015, 01:49:11 »
весь контроллер:
Спойлер
[свернуть]
стандартный контроллер на редактирование записи в админке

*

zomby6888

  • Живу я здесь
  • ******
  • 1484
  • 167
Re: Связать два списка в админке
« Ответ #21 : 19.02.2015, 01:57:57 »
а аякс-модель тут каким боком? Ее методы вроде нигде не вызываются. И пустой список почему то контроллер возвращает. Непонятно
интернет-блог: http://websiteprog.ru

*

Fedor Vlasenko

  • Профи
  • ********
  • 3800
  • 698
  • Все начинается с Value
Re: Связать два списка в админке
« Ответ #22 : 19.02.2015, 01:58:21 »
Код: php
$options = array();
// получаем данные  //
Саша на тебя возложил реализацию получения этих данных
кстати я не вижу здесь getCityListSite()
так наверное понятнее js
Код: javascript
(function ($) {
$('#region').on('change', function () {
var region = this.value;
$.get('index.php',
{
option: 'com_organisations',
task: 'getCityListSite',
region: region
},
function (response) {
response && $('.city-block').html(response);
});
});
})(Query);

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #23 : 19.02.2015, 02:09:13 »
С js все понятно.

Код: php
$options = array();
// получаем данные  //
Саша на тебя возложил реализацию получения этих данных
Упс... я-то получаю данные в аякс-модели, а вызываю метод контроллера...

Данные загоняем в $options? В каком виде они должны там быть, двумерный массив? - с этим разобрался
« Последнее редактирование: 19.02.2015, 02:14:53 от AlekVolsk »

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #24 : 19.02.2015, 02:27:15 »
всегда в таких случаях первое действие должно быть набор в браузере адреса: site.ru/index.php?option=com_crmtourism&task=getListSites&partner=1
Смотрите что выводит! Так вы можете посмотреть правильно ли у вас сформирован адрес и ловит ли контроллер задачу!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #25 : 19.02.2015, 02:30:27 »
В контроллере:
Код: php
  public function getListSites()
  {
    $options = array();
    $id = filter_input(INPUT_GET, 'partner', FILTER_VALIDATE_INT);
    $result = JFactory::getDbo()->setQuery('select `id`, `s_url` from `#__crmt_sites` where `s_partner`='.(int)$id)->loadObjectList();
    foreach ($result as $item)
      $options[] = JHTML::_('select.option', $item->id, $item->s_url);
    echo JHtml::_('select.genericlist', $options, 'jform[partsite]', '' );
    exit;
  }
Скрипт:
Код: javascript
  jQuery(document).ready(function ($) {
    $('#jform_partname').on('change', function () {
      $.get('index.php', {option:'com_crmtourism', task:'getListSites', partner:$(this).val()}, function (response) {
        alert(response);
        //response && $('.partsite').html(response);
        //$('select').chosen();
      });
    });
  })
Все равно возвращает страницу админки целиком, как и в случае с
всегда в таких случаях первое действие должно быть набор в браузере адреса: site.ru/index.php?option=com_crmtourism&task=getListSites&partner=1
Смотрите что выводит! Так вы можете посмотреть правильно ли у вас сформирован адрес и ловит ли контроллер задачу!

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #26 : 19.02.2015, 02:32:22 »
уверены в правильности написания com_crmtourism?
попробуйте
public function getListSites()
  {
    die('method work!');
  }
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #27 : 19.02.2015, 02:35:46 »
Я мож не в том контроллере чего пишу?
уверены в правильности написания com_crmtourism?
попробуйте
public function getListSites()
  {
    die('method work!');
  }
уверен
не помогло

*

Aleks.Denezh

  • Практически профи
  • *******
  • 2785
  • 376
Re: Связать два списка в админке
« Ответ #28 : 19.02.2015, 02:36:46 »
Я мож не в том контроллере чего пишу?
100%! Нужно в дефолтном что у вас в com_crmtourism/controller.php
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016

*

AlekVolsk

  • Профи
  • ********
  • 6301
  • 336
Re: Связать два списка в админке
« Ответ #29 : 19.02.2015, 02:39:37 »
не, ну надо же опять 3 часа тупить, а ведь только мес назад на том же самом споткнулся
работает!