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

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

Взаимоисключающие чекбоксы в форме с кастомными полями

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

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

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


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


« : 28.08.2016, 04:47:13 »

Доброго времени суток уважаемые форумчане. столкнулся с проблемой, решение которой не смог найти в сети, прошу вашей помощи. Суть такова: есть некая форма с полями. Форма отправляет запрос в бд на выборку записей с условием которое зависит от того какие данные переданные в форме. Что то по типу фильтра товаров. В форме есть 2 столбца с чекбоксами. Данные чекбоксы реализованы созданием собственного типа полей. То есть есть 2 файла в котором определяются 2 кастомных типа поля которые выводят в виде чекбоксов в форме определенные данные (страны и отели). Столкнулся страблой что записей сильно много и в столбце с отелями выводиться сразу слишком много инфы (окала 5 к записей), что есесн не есть хорошо. Хочу реализовать сл : при выборе в первом столбце страны, во втором столбце будут подгружаться отели, в которых указанно что они в этой стране (передаю ид страны и выбираю из бд записи с таблицы с отелями те в которых есть ид выбранной страны). И вот тут я и столкнулся с непониманием. Как связать 2 разных типа поля ? Точнее как после выбора страны передать в запрос на выборку записей с отелями условие что ид страны должен быть тот что мы передали при выборе страны или стран ?

Ниже привожу код файлов с кастомными полями и скриин формы о которой идет речь :

Выбор стран :

Код
<?php 
defined('_JEXEC') or exit;
class JFormFieldResort extends JFormField {
 
   protected $type = 'Resort';
 
   public function getInput() {
 
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('#__resort');
       if (JLanguageMultilang::isEnabled()) {
           $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
       }
 
       $db->setQuery($query);
         $citys_list = $db->loadObjectList();
         $var_list ='';
         foreach($citys_list as $citys){
           $var_list.= '<div><input name="'.$this->name.'[]" type="checkbox" value="'.$citys->id.'">'.$citys->title.'</div>';          }
         return $var_list;
       }
}
 
 

Код выбора отелей :

Код
<?php 
defined('_JEXEC') or exit;
class JFormFieldHotels extends JFormField {
 
   protected $type = 'Hotels';
 
   public function getInput() {
 
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('#__hotels');
       if (JLanguageMultilang::isEnabled()) {
           $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
       }
 
       $db->setQuery($query);
         $hotels_list = $db->loadObjectList();
         $var_list ='';
         foreach($hotels_list as $hotels){
           $var_list.= '<div><input name="'.$this->name.'[]" type="checkbox" value="'.$hotels->id.'">'.$hotels->title.'</div>';          }
         return $var_list;
       }
}
 
 

Скрин формы о которой идет речь во вложении.

Уже голову сломал Sad Прошу помощи кто знает


* 1.jpg (27.73 Кб, 765x205 - просмотрено 15 раз.)
Записан
fsv
Практически профи
*******

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

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


« Ответ #1 : 28.08.2016, 23:29:21 »

Как связать 2 разных типа поля ? Точнее как после выбора страны передать в запрос на выборку записей с отелями условие что ид страны должен быть тот что мы передали при выборе страны или стран ?
После выбора в первом столбце - аякс-запрос на получение данных для второго. До выбора в первом на месте второго - "выберите страну", да и страны удобнее селектом.
В getInput()
Код:
$this->getJS();
+ дописать функцию
Код:
private function getJS()
{
   $js = 'jQuery(function($) {
if( $('#idDivOfCities').length ){
    // обработка выбора страны в селекте
}
            })';
    $doc = JFactory::getDocument();
    $doc->addScriptDeclaration( $js );
}
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #2 : 29.08.2016, 07:23:51 »

да и страны удобнее селектом.

возможно но мне необходима возможность выбора сразу нескольких стран чекбоксами.

То есть в файле который выводит страны я подключаю AJAX. Формирую переменную со значениями выбора стран и передаю их в переменную которая после должна обработаться вторым файлом для второго столбца ? (прошу прощение за глупый вопрос но вот в этом моменте я совсем не понимаю. Аякс я использовал но как его в моем случае прикрутить пока не совсем понимаю Sad )
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #3 : 29.08.2016, 18:16:05 »

Такс, с передачей данных в контроллер из формы при помощи jquery вроде бы разобрался. Теперь  чуть иная ситуация -  у меня есть кастомные поля (те же чекбоксы). Мне необходимо из контроллера вытянуть переменную и с ней уже работать в файле который отвечает за вывод чекбоксов. Кто знает подскажите плз - как передать переменную из контроллера в фаил с полями ? Сосбвенно пример :

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

Код
	public function postResort() {
$arr = json_decode($_POST['arr']);
return $arr;
//echo json_encode( array( 'message' => $arr) );
exit;
}
 

В папке models / fields  есть фаил hotels.php который выбирает отели и формирует из них чекбоксы :

Код
<?php 
defined('_JEXEC') or exit;
class JFormFieldHotels extends JFormField {
 
   protected $type = 'Hotels';
 
   public function getInput() {
 
       $db = JFactory::getDbo();
       $query = $db->getQuery(true);
       $query->select('*');
       $query->from('#__hotels');
       if (JLanguageMultilang::isEnabled()) {
           $query->where('language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')');
       }
 
       $db->setQuery($query);
         $hotels_list = $db->loadObjectList();
         $var_list ='';
         foreach($hotels_list as $hotels){
           $var_list.= '<div><input name="'.$this->name.'[]" type="checkbox" value="'.$hotels->id.'">'.$hotels->title.'</div>';          }
         return $var_list;
       }
}
 
 
 
 

Собственно ступор у меня в том что бы вытянуть из контроллера toursearch.php переменную $arr и передать ее в фаил hotels.php и в дальнейшем уже создать условие выборки отелей и формирования чекбоксов
Записан
fsv
Практически профи
*******

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

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


« Ответ #4 : 30.08.2016, 00:33:49 »

То есть в файле который выводит страны я подключаю AJAX.
Нет, в JFormFieldHotels.

Цитировать
Такс, с передачей данных в контроллер из формы при помощи jquery вроде бы разобрался.
Где? Не вижу в getInput() в JFormFieldHotels js-кода (или его подключения).

В аякс-запросе примерно такой URL будет:
Код:
url: 'index.php?option=com_youname&view=youname&task=getAjaxData',
В controller.php - function getAjaxData(), в которой из модели получаете результат запроса в БД и отдаете его.
   
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #5 : 30.08.2016, 07:35:10 »

В controller.php - function getAjaxData(), в которой из модели получаете результат запроса в БД и отдаете его.

Чуть вас не понял. смотрите, в виде самой формы я разместил скрипт :

Код
	var arr = [];
var i = 0;
$("input.resort").change(function(){
   if(this.checked){
       arr[i] = $(this).val();
       i++;
   }else{
       var val = $(this).val();
       var index = arr.indexOf(val);
       arr.splice(index, 1);
       i--;
   }
   var data='arr='+JSON.stringify(arr);
   //alert(data);
 
$.post('index.php?option=com_toursearch&task=toursearch.postResort',
data, function (responce) {
<?=$this->form->getInput('hotels'); ?>
   //alert(responce.message);
}, 'json');
 
 
 
});
 

После работы скрипта в суб контроллер toursearch.php поступают данные которые я могу обработать. Далее в файле с чекбоксами отелей я подключаю контроллер и получаю результат работы субконтроллера

Код
$controller = new ToursearchControllerToursearch(); 
echo $controller->execute('postResort');
 

Трабла в том что аякса действительно нет. Но я, честно говоря, так и не понял как мне прикрутить AJAX. Изначально ступор был в том что в доках написанно что в компоненте AJAX можно использовать если есть тег формы и URL в нем будет прописан в том виде как вы и писали ранее

url: 'index.php?option=com_youname&view=youname&task=getAjaxData',

но у меня уже есть форма и я решил  сделать чуть иначе передав данные через скрипт.

Видимо я что то напутал в последовательности  передачи данных, потому что сейчас, передав данные в субконтроллер я по сути ничего с ними дальше сделать не могу. В hotels.php (JFormFieldHotels) передаеться только значение по умолчанию а не то что отдает скрипт в JSON Sad
Записан
fsv
Практически профи
*******

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

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


« Ответ #6 : 30.08.2016, 23:48:13 »

в виде самой формы я разместил скрипт
А, ну компонент ваш, в виде так в виде. Не вижу предмета для спора, просто у меня взгляд на кастомное поле чуть другой: должна быть переносимость кода, возможность его повторного использования, т.е. этот один файл класса должен быть самодостаточный.
Цитировать
Трабла в том что аякса действительно нет. Но я, честно говоря, так и не понял как мне прикрутить AJAX. Изначально ступор был в том что в доках написанно что в компоненте AJAX можно использовать если есть тег формы и URL в нем будет прописан в том виде как вы и писали ранее
url: 'index.php?option=com_youname&view=youname&task=getAjaxData',
но у меня уже есть форма и я решил  сделать чуть иначе передав данные через скрипт.
"Доки читал, статьи читал, делаю по другому. Почему не получается?"
О чем разговор? Попробуйте по докам сначала. И здесь пару статей на эту тему, и здесь.
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #7 : 30.08.2016, 23:57:23 »

"Доки читал, статьи читал, делаю по другому. Почему не получается?"
за ссылки спс - сайты эти знаю, там реально много полезной инфы Azn. На счет доков и прочего - я не совсем понимаю как в Joomla  работает компонент AJAX. Доки читал но исходя из них для компонента AJAX подключаеться чуть иначе нежели для модуля (во всех примерах в случае использования аякса в компоненте использовалась форма  с указанным обработчиком, в модуле чуть иначе) что и привело меня в начале работы в некий ступор.

 Сейчас вот хочу попробовать (правда не знаю что из этого выйдет и как бы вообще можно ли так делать) в субконтроллере использовать функцию которая и делает кастомное поле и после ее уже отдать как результат отработки аякса. ТО есть из вида в субконтроллер я отдаю данные, обрабатываю их до нужного вида, передаю в функцию результатом которой будет список чекбоксов и после этот результат возвращаю снова в вид.

Иначе я в тупике потому что : аяксом я могу обратиться в контроллер и получить от него ответ. Но у меня должен еще использоваться фаил с чекбоксами и как из контроллера в JFormFieldHotels передать инфу а после обратно в контроллер для того что бы вывести результат работы используя AJAX - не понятно и нет нигде хотя бы абстрактных похожих примеров.
Записан
fsv
Практически профи
*******

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

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


« Ответ #8 : 01.09.2016, 01:40:42 »

не понятно и нет нигде хотя бы абстрактных похожих примеров.
Если до 06.09 не решите вопрос, напомните, дам "похожий пример". Сейчас в отпуске, нет возможности.
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #9 : 04.09.2016, 17:10:12 »

Если до 06.09 не решите вопрос, напомните, дам "похожий пример". Сейчас в отпуске, нет возможности.

Проблему решил Но ОЧЕНЬ ОЧЕНЬ костыльно и неправильно . Плз сбросьте пример как сделать таск правильно и кошерно. Буду признателен Azn
Записан
fsv
Практически профи
*******

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

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


« Ответ #10 : 08.09.2016, 00:03:02 »

сбросьте пример
Прикрепил. Удалил там лишнее.
2 зависимых селекта в админке. Было 3, убрал один, чтобы не мешал.
Т.к. админка, скрипты в head поленился засунуть, и js лишний есть - с бутстрапом боролся. Думаю, сами разберетесь.

* ajax.zip (4.31 Кб - загружено 1 раз.)
Записан
voron121
Осваиваюсь на форуме
***

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

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


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


« Ответ #11 : 09.09.2016, 13:23:27 »

Прикрепил. Удалил там лишнее.

Спасибо большое, буду разбираться Azn
Записан
Страниц: [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