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

voron121

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

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

Выбор стран :

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


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

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

fsv

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

voron121

  • Захожу иногда
  • 216
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
да и страны удобнее селектом.

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

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

voron121

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

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

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

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

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

  • Живу я здесь
  • 2529
  • 370 / 2
То есть в файле который выводит страны я подключаю AJAX.
Нет, в JFormFieldHotels.

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

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

voron121

  • Захожу иногда
  • 216
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
В controller.php - function getAjaxData(), в которой из модели получаете результат запроса в БД и отдаете его.

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

Код: javascript
	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 поступают данные которые я могу обработать. Далее в файле с чекбоксами отелей я подключаю контроллер и получаю результат работы субконтроллера

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

fsv

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

voron121

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

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

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

fsv

  • Живу я здесь
  • 2529
  • 370 / 2
не понятно и нет нигде хотя бы абстрактных похожих примеров.
Если до 06.09 не решите вопрос, напомните, дам "похожий пример". Сейчас в отпуске, нет возможности.
Веб-разработка: заказ.
*

voron121

  • Захожу иногда
  • 216
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Если до 06.09 не решите вопрос, напомните, дам "похожий пример". Сейчас в отпуске, нет возможности.

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

fsv

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

voron121

  • Захожу иногда
  • 216
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Прикрепил. Удалил там лишнее.

Спасибо большое, буду разбираться :)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

В форме регистрации пропадают названия полей

Автор grigkh

Ответов: 4
Просмотров: 209
Последний ответ 05.11.2017, 16:33:40
от grigkh
Пропала вкладка с полями в "Менеджер материалов: Изменить материал"

Автор Sintez83

Ответов: 2
Просмотров: 180
Последний ответ 25.10.2017, 19:42:20
от Sintez83
Личный кабинет с расширенными полями и возможностью их корректировать

Автор Дмитрий Седелков

Ответов: 3
Просмотров: 130
Последний ответ 23.10.2017, 18:26:36
от Septdir
Регистрация/Вход с 2 полями EMAIL и Пароль? Joomla 3

Автор baskethome

Ответов: 4
Просмотров: 339
Последний ответ 22.10.2017, 21:46:08
от pavelrer
Названия полей исчезают в форме регистрации

Автор Мук

Ответов: 1
Просмотров: 228
Последний ответ 03.08.2017, 18:20:47
от Мук