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

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

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

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

Репутация: +317/-3
Offline Offline

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



« : 18.02.2015, 15:22:57 »

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

Репутация: +372/-4
Offline Offline

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



« Ответ #1 : 18.02.2015, 17:16:31 »

Это связанные поля, либо писать один контрол с кучей скриптов (в котором будут выводится два связанных поля)
Либо второе дергать аяксом!
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #2 : 18.02.2015, 17:21:46 »

Упс, не все так просто в 3/9 королевстве, как это может показаться из 3/10... Вечно у меня задачки типа "как поковыряться в левой ноздре мизинцем правой пятки" ( Azn )

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

Репутация: +372/-4
Offline Offline

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



« Ответ #3 : 18.02.2015, 17:29:23 »

Вы такое делали?
Естественно... все очень просто (если у вас свой компонент, а у вас 100% свой компонент )
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #4 : 18.02.2015, 17:34:56 »

Да, 100% свой компонент, J3.last.
Правильно ли понял: на первый список вешаем onchange js => в котором вызываем аякс-функцию => делаем выборку для второго списка = > результат возвращаем во вьюху => присваиваем второму списку результат выборки из аякс-функции. 2 последних шага чего-то в ступор вводят немного.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #5 : 18.02.2015, 18:32:46 »

При смене первого селект стучимся куда то аяксом, возвращаем в результате дргой селект и ложим его в нужный нам блок
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #6 : 18.02.2015, 18:36:13 »

возвращаем в результате дргой селект
Сформировываем готовый HTML?

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

Репутация: +372/-4
Offline Offline

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



« Ответ #7 : 18.02.2015, 20:30:14 »

Сформировываем готовый HTML?
Да ) Почему бы нет?)

Посмотрел разметку. Вывод раскрывающегося списка на bs2 - жесть. А если шаблон админки у конечного будет другой, не на bs2?
не совсем понял про какой вы список говорите
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #8 : 18.02.2015, 20:53:34 »

не совсем понял про какой вы список говорите
http://www.floomby.ru/s2/Ye3Dad
обычный список, выводимый посредством echo $this->form->getInput('fieldname'); описанный в XML как type="list" с кучей options
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #9 : 18.02.2015, 22:20:48 »

обычный список, выводимый посредством echo $this->form->getInput('fieldname'); описанный в XML как type="list" с кучей options
Так то же скриптом херачится ) Вам не нужно ничего делать! Просто подрубить нужный скрипт:
Код
<?php JHtml::_( 'formbehavior.chosen', 'select' ); ?>
И все, не нужно будет что то править!

Вот например на этом сайте так делал: http://stroykanews.com/katalog.html
Код
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>

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

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

Главное в XML файле формы добавить это поле
Код
<field name="city" type="list" label=""></field>
И его можно вывести с какими то базовыми данными...
« Последнее редактирование: 18.02.2015, 22:29:56 от Istaan » Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #10 : 18.02.2015, 22:24:15 »

Спс, пробую.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #11 : 19.02.2015, 00:02:44 »

Что имею в начале: http://www.floomby.ru/s2/je3sjx

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

Скрипт в шаблоне вьюхи:
Показать текстовый блок

Поля в шаблоне вьюхи выводятся так:
Показать текстовый блок

Аякс-модель:
Показать текстовый блок

В контроллере, связанной с данной вьюхой:
Показать текстовый блок

Задействованная пара полей в xml:
Показать текстовый блок

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

Репутация: +344/-11
Offline Offline

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


« Ответ #12 : 19.02.2015, 00:12:30 »

AlekVolsk, AJAX - удобная штука и совсем не сложная. В вашем случае все примерно так выглядит:
- выбираете значение select и заодно отправляете форму обработчику,
- обрабочик принимает параметр, обрабатывает и выдает HTML-код (хотя может быть другие форматы: JSON, XML...)
- HTML-код выводится на стрнанице.
Только все это происходит без перезагрузки страницы.

P.S. Ooops, не видел ваш последний пост.
« Последнее редактирование: 19.02.2015, 00:15:56 от robert » Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #13 : 19.02.2015, 00:17:58 »

P.S. Ooops, не видел ваш последний пост.
В том-то вся и фишка... До этого уже много чего на аяксе наваял, просто с мастер-детайл впервые столкнулся на нем, чего-то опять недогоняю
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #14 : 19.02.2015, 00:28:05 »

Поменял $('.partsite').html(response); на alert(response); посмотрел, что выводит - там полная html-страница. Что-то в аякс-модели не так?
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

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


« Ответ #15 : 19.02.2015, 00:31:32 »

добавьте exit; в методе контроллера, он у Вас скорее всего весь шаблон тащит. А может ошибку отдает. Ответ аякса лучше в консоль выводить и там мониторить а не алертом.
« Последнее редактирование: 19.02.2015, 00:36:39 от zomby6888 » Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #16 : 19.02.2015, 00:36:41 »

Он там есть:
Код
  public function getListSites()
 {
   $options = array();
   echo JHtml::_('select.genericlist', $options, 'jform[partsite]', '' );
   exit;
 }
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

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


« Ответ #17 : 19.02.2015, 00:38:02 »

посмотрел, что выводит - там полная html-страница.
Именно та страница?
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #18 : 19.02.2015, 00:42:38 »

нет, просто вьюха по умолчанию этого-же компонента, полностью вся страница админки
селекты в другой вьюхе

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

Репутация: +344/-11
Offline Offline

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


« Ответ #19 : 19.02.2015, 00:47:54 »

С контроллером не ладно.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #20 : 19.02.2015, 00:49:11 »

весь контроллер:
Показать текстовый блок
стандартный контроллер на редактирование записи в админке
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

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


« Ответ #21 : 19.02.2015, 00:57:57 »

а аякс-модель тут каким боком? Ее методы вроде нигде не вызываются. И пустой список почему то контроллер возвращает. Непонятно
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

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


Все начинается с Value


« Ответ #22 : 19.02.2015, 00:58:21 »

Код
$options = array();
// получаем данные  //
Саша на тебя возложил реализацию получения этих данных
кстати я не вижу здесь getCityListSite()
так наверное понятнее js
Код
(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
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #23 : 19.02.2015, 01:09:13 »

С js все понятно.

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

Данные загоняем в $options? В каком виде они должны там быть, двумерный массив? - с этим разобрался
« Последнее редактирование: 19.02.2015, 01:14:53 от AlekVolsk » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #24 : 19.02.2015, 01:27:15 »

всегда в таких случаях первое действие должно быть набор в браузере адреса: site.ru/index.php?option=com_crmtourism&task=getListSites&partner=1
Смотрите что выводит! Так вы можете посмотреть правильно ли у вас сформирован адрес и ловит ли контроллер задачу!
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #25 : 19.02.2015, 01:30:27 »

В контроллере:
Код
  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;
 }
Скрипт:
Код
  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
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #26 : 19.02.2015, 01:32:22 »

уверены в правильности написания com_crmtourism?
попробуйте
public function getListSites()
  {
    die('method work!');
  }
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #27 : 19.02.2015, 01:35:46 »

Я мож не в том контроллере чего пишу?
уверены в правильности написания com_crmtourism?
попробуйте
public function getListSites()
  {
    die('method work!');
  }
уверен
не помогло
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #28 : 19.02.2015, 01:36:46 »

Я мож не в том контроллере чего пишу?
100%! Нужно в дефолтном что у вас в com_crmtourism/controller.php
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

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



« Ответ #29 : 19.02.2015, 01:39:37 »

не, ну надо же опять 3 часа тупить, а ведь только мес назад на том же самом споткнулся
работает!
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

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