Новости Joomla

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

👩‍💻 Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1. Это релиз, в который включены уже проверенные изменения, но ещё очень многие исправления и улучшения ждут своей очереди. Joomla следит за качеством и безопасностью своего кода и каждое изменение должно быть успешно протестировано как минимум ещё двумя участниками сообщества. Разработка Joomla ведётся на платформе GitHub.Филипп Уолтон (Philip Walton) - один из разработчиков, кто активно вносит свой вклад в ядро Joomla. Он уже несколько месяцев посвящает свои послеполуденные часы пятницы работе с Joomla и предлагает присоединиться к нему. 📆 Пятница, 30 мая 2025, с 15:00 до 17:00 по UTC (Лондон) - с 18:00 до 20:00 по Москве.В чате Google Meet Филипп готов помочь с тестированием тем, кто будет делать это в первый раз. А так же он подготовил список лёгких Pull Request, которые можно протестировать довольно быстро. Чем больше тестов будет проведено сейчас, тем меньше ошибок вылезет потом. На данный момент 148 (уже 147 на момент написания заметки) PR на GitHub Joomla ждут тестирования.👩‍💻 Open to all. All together.Также вам поможет сделать первые шаги это видео.GitHub JoomlaДа, это вечер пятницы. Но тестирование занимает порой минут 15, а доброе дело сделано. Просто убедитесь, что разработчик чего-то не пропустил и всё работает как ожидается.#joomla #joomla6 #community

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

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Приветствую уважаемых форумчан, нужен ваш совет!

Проблема в следующем: есть макет компонента в котором выводятся записи на прием к специалистам по косметологии. Под каждой записью есть кнопка изменить запись, которая вызывает модальное окно бутстрап с расписанием мастера, выводимое циклом PHP. Мне нужно каким то образом передать id мастера в модальное окно, чтобы выводилось расписание конкретного мастера. Я пытаюсь передать его аяксом: беру из кнопки атрибут с айдишником и отправляю в модальное окно.

Консоль говорит, что все ровно, сервер отвечает 200, показывает передаваемое значение, но в $master = JFactory::getApplication()->input->post->get('master', '') модального окна приходит результат string(0)"". В начале модалки стоит  defined('_JEXEC') or die('Restricted access') Если поменять url в аяксе на контролер, то значение передается, а в модалку или файл в той же папке - ни фига. Видимо это связано с тем, что содержимое окна загружается раньше, чем приходит значение айдишника.

У меня вопрос к бывалым : Как ВЫ решаете подобные задачи?
*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Можно увидеть код который вы используете HTML и JS
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Можно увидеть код который вы используете HTML и JS
Это макет списка записей:
Код
<?php defined('_JEXEC') or die;
JLoader::register('JTplHelper', JPATH_SITE . '/templates/ryba/html/helper.php');
//$this->document->setTitle($this->document->title.' - '.JsnHelper::getFormatName($this->data));
$dispatcher   = JEventDispatcher::getInstance();
$this->user= JsnHelper::getUser();
$this->current_user=JsnHelper::getUser();
//$user=JsnHelper::getUser();
$timeZone = $this->user->getParam('timezone', 'UTC');
$hidden_rows = $visible_rows = 0;
//var_dump($timeZone);
?>
<!-- Main Container -->
<div class="jsn-p">
<?php
    if(!$this->items || !count($this->items)):?>
      <h3>Записи не найдены</h3>
   <?php else:?>
      <h2>Ваши записи:</h2>
      <?php foreach($this->items as $i=>$order){
         $add_class = (JFactory::getDate($order->time)<JFactory::getDate())?' text-muted hidden':'';
         if(!$add_class)
            $visible_rows += 1;
         else $hidden_rows += 1;
   $user_m = JsnHelper::getUser($order->master_id);
   $break_start = strtotime($order->time);
    $break_end = strtotime($order->time_to);
    $duration =   $break_start - $break_end;
   $time_sum = abs($duration);
   ?>                                     
             <div id="row" class="row m-0<?php echo $add_class ?>" style="padding: 6px 0;">
            <div class="col-sm-5 col-md-2 p-0"><?php echo JHtml::_('date', $order->time, 'Дата: '.'d-m-y'.'/'.'H:i'.' - '.date("H:i", strtotime($order->time_to)));?> </div>
            <div class="col-sm-7 col-md-6"><?php echo $order->service_name.($order->tag_id ? ' /'.$order->tag_name : '');?></div>
            <div class="col-xs-6 col-sm-5 col-md-2"><?php echo number_format($order->price, 0, '.', ' ').'p.';?></div>
            <div class="col-xs-6 col-sm-7 col-md-2"><a href="<?php echo $user_m->getLink();?>"><?php echo $user_m->get('firstname').' '.$user_m->get('lastname').'/'.$user_m->get('id');?></a></div>
            <div class="col-xs-6 col-sm-8 col-md-2">
            <?php if(JFactory::getDate($order->time)>JFactory::getDate()): ?>
             <button type="button" class="btnrpl" data-toggle="modal" data-target="#rpl" data-svc-name="<?= $order->svc_name ?>" data-timesum="<?= $time_sum ?>" data-master="<?= $order->master_id ?>" data-svc-id="<?= $order->svc_id ?>" data-tag-id="<?= $order->tag_id ?>" style="margin: 3rem auto;">
            Изменить
            </button>
              </div>
            <div class="col-xs-6 col-sm-8 col-md-2">
             <button type="button" class="btndel" data-toggle="modal" data-target="#del" data-svc-name="<?= $order->svc_name ?>" data-master="<?= $order->master_id ?>" data-time="<?= $order->time ?>" data-tag-id="<?= $order->tag_id ?>" style="margin: 3rem auto;">
            Отменить
            </button><?php endif;?>
              </div>
         </div>
         <?php }?>
      <?php if($hidden_rows && $visible_rows):?>
      <div class="row m-5">
         <a class="btn btn-success" style="margin: 3rem auto;" href="#" onclick="jQuery(this).parent().siblings().toggleClass('hidden')">Архивные показать/скрыть</a>
      </div>
      <?php endif;?>
      <?php if($hidden_rows && !$visible_rows):?>
            <style>.jsn-p .row.hidden{display: flex;}</style>
      <?php endif;?>
     
   <?php endif;?>
    <?php
   if(isset($user_m)&& !empty($user_m)):
   $work_day = (array)$user_m->getValue('work_day');
    $work_from = $user_m->getValue('work_from')? $user_m->getValue('work_from') : '[0]';
    $work_to = $user_m->getValue('work_to')? $user_m->getValue('work_to') : '[0]';

    $work_from = json_decode(($work_from[0]=='[')? $work_from : '['.$work_from.']');
    if(count($work_from)==1)
   $work_from = array_fill(0, 7, $work_from[0]);
    elseif(count($work_from)==count($work_day)){
   $work_from = array_replace(array_fill(0, 8, 0), array_combine($work_day, $work_from));
   array_shift($work_from);
    }

    $work_to = json_decode(($work_to[0]=='[')? $work_to : '['.$work_to.']');
    if(count($work_to)==1)
   $work_to = array_fill(0, 7, $work_to[0]);
    elseif(count($work_to)==count($work_day)){
   $work_to = array_replace(array_fill(0, 8, 0), array_combine($work_day, $work_to));
   array_shift($work_to);
    }
    //if(is_object($work_day) && is_object($work_from) && is_object($work_to))
    foreach($work_day as $wd)
   foreach(range(ceil($work_from[$wd-1]), floor($work_to[$wd-1])) as $hour)
     //if(isset($this->data->work))
      $this->data->work[$wd][] = $hour;
   endif;
   ?>
    </div>
    <script>
   $(document).ready(function($) {
      $('#rpl').insertAfter('head');   
     
      $('.btnrpl').click(function(e){
                 
            var svc_id  = $(this).attr('data-svc-id');
            $('.svcid').val(svc_id);
         
         var tag_id  = $(this).attr('data-tag-id');
            $('.tagid').val(tag_id);
         
         var svc_name  = $(this).attr('data-svc-name');
            $('.svcname').val(svc_name);
         
         var time_sum = $(this).attr('data-timesum');
         $('.time_sum').val(time_sum);
         
         var master_id  = parseInt($(this).attr('data-master'));
              $('.masid').val(master_id);
         
         var url = '../templates/ryba/html/com_jsn/orders/default_modal.php';
         
         $.ajax({
            url: url,
            data: {'master': master_id},
            type: "post",
         success: function(data) {
            alert("Here: " + data);
            }
            });
         console.log("Ответ сервера:\n" + data);
        });         
         
         
         $('#rpl').on('shown.bs.modal', function (event) {
            var id = $(event.relatedTarget).attr('data-master');
            $('.master').val(id);
            $('.calendar__master').slick("refresh");
            $('#rpl .screen').hide();
            $('#rpl .screen1').show();
            $('.calendar__master input:checked').removeAttr('checked');
            $('.calendar__master.preload').removeClass("preload");
         });
         
         $('#rpl .btn-next').click(function(el){
            var scr = jQuery(this).closest('.screen');
            if(scr.hasClass('screen1')){
               if(!scr.find('input:checked').length)
                  $('.calendar__master').addClass('error');
               else{
                  var date = new Date(scr.find('input:checked').first().val());
                  $('#req_date').html(date.toLocaleString().slice(0, 10).split('/').reverse().join('.'));               
                  $('#req_time').html(date.getHours()+':'+(date.getMinutes()==0?'00':date.getMinutes()));
                 
                  $('.calendar__master').removeClass('error');
                  scr.hide().next().show();
               }
            }else if(scr.hasClass('screen2'))
               scr.hide().next().show();
            else if(scr.hasClass('screen3'))
               if($('#order-form').find('input[name="name"]').val()=='')
                  $('#order-form').find('input[name="name"]').addClass('invalid');
               else if($('#order-form').find('input[name="telefon"]').val()=='')
                  $('#order-form').find('input[name="telefon"]').addClass('invalid');
               else {
                  $.ajax({type: "POST", url: '?option=com_jsn&format=json&task=update',
                     data: scr.closest('form').serialize(), dataType: 'json',
                     success: function(data){
                        if(data.success){
                           $('#rpl').modal('hide');
                           document.location.reload();                     
                        }
                        else{
                           if(!$('#order-form .error-msg').length)
                              $('<div class="error-msg"></div>').insertAfter($('#order-form .days__btns'));
                           $('#order-form .error-msg').html(data.message);
                        }
                     }
                  });
               }
          });
      $('#del').insertAfter('head');
        $('.btndel').click(function(){
                 var master  = $(this).attr('data-master');
                    $('.masid').val(master);
                var time  = $(this).attr('data-time');
                    $('.svctime').val(time);
                 var tag_id  = $(this).attr('data-tag-id');
                    $('.tagid').val(tag_id);
                 var svc_name  = $(this).attr('data-svc-name');
                    $('.svcname').val(svc_name);
               
             $('.btn-del').click(function(){
            $.ajax({type: "POST", url: '?option=com_jsn&format=json&task=del',
               data: $('#del-form').serialize(), dataType: 'json',
               success: function(data){
                  if(data.success){
                     $('#del').modal('hide');
                     document.location.reload();
                  }
                       
               }
             });
          });
       });
   });
   </script>
   <?php echo $this->loadTemplate('modal');?>
Это модальное окно:
Код
<?php  defined('_JEXEC') or die('Restricted access');
require_once JPATH_SITE.'/templates/ryba/html/com_jsn/orders/temp.php';
?>
      <!-- Modal  THIS ORDER-->
      <div class="modal fade" id="rpl" role="dialog" name="master" aria-labelledby="exampleModalLabel"   aria-hidden="true">
          <input type="hidden" name="master" class="master" value=""/>
         <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body">
                  <form id="order-form" method="POST" action="/">
                        <div class="screen screen1">
                            <div class="calc__body">
                                <h2>Изменить время записи на услугу</h2>
                            <div class="calendar__master preload">
                           <?php
                           
                           $db = JFactory::getDbo();
                           foreach($this->items as $i=>$order)
                           $user_m = JsnHelper::getUser($order->master_id);
                                                               
                           $this->reserved_time = array();
                                    if($user_m->id){
                                   $db->setQuery("SELECT CONCAT(DATE(time), ' ', TIME(time)) FROM #__jsn_orders WHERE time>NOW() AND master_id=".$db->quote($user_m->id));
                                   $this->reserved_time = $db->loadColumn();
                                   }   
                                    $this->reserved_time_to = array();
                                    if($user_m->id){
                                   $db->setQuery("SELECT CONCAT(DATE(time_to), ' ', TIME(time_to)) FROM #__jsn_orders WHERE time>NOW() AND master_id=".$db->quote($user_m->id));
                                   $this->reserved_time_to = $db->loadColumn();
                                   }
                                    $this->stock_time = array();
                                    if($user_m->id){
                                   $db->setQuery("SELECT CONCAT(DATE(time), ' ', TIME(time)) FROM #__jsn_stocks WHERE time>NOW() AND master_id=".$db->quote($user_m->id));
                                   $this->stock_time = $db->loadColumn();
                                   }   
                                    $this->stock_time_to = array();
                                    if($user_m->id){
                                   $db->setQuery("SELECT CONCAT(DATE(time_to), ' ', TIME(time_to)) FROM #__jsn_stocks WHERE time>NOW() AND master_id=".$db->quote($user_m->id));
                                   $this->stock_time_to = $db->loadColumn();
                           }   
                           
                                    $date = JFactory::getDate();                           
                           foreach(range(1, 14) as $day){?>
                                    <div class="calendar__master-item">
                              <span class="mas-date">
                                 <?php echo $date->format("d.m.Y");?>
                                 <b><?php echo mb_strtolower($date->format("D"))?>.</b>
                              </span>
                              <?php
                              $wday = $date->format("w"); $wday = $wday ? $wday : 7; //var_dump(max($this->data->work[$wday]) > (float)date("G")+1);
                              if(array_key_exists($wday, $this->data->work) && ($day>1 || max($this->data->work[$wday]) < $date->format("d.m.Y"))):?>
                              <p class="btns-m">
                              <?php
                              if($this->current_user->id){   
                              $work_from = $user_m->getValue('work_from');
                                        $work_to = $user_m->getValue('work_to');
                              }
                                        else{
                               $work_from = $this->user->getValue('work_from')? $this->user->getValue('work_from') : '[0]';
                                        $work_to = $this->user->getValue('work_to')? $this->user->getValue('work_to') : '[0]';
                              }                             
                                 $start = strtotime($work_from);
                                 $end = strtotime($work_to);
                                 
                                 $step = 15 * 60;
                                 $arr_work = array();
                               for($i = $start; $i <= $end; $i += $step){
                                  $arr_work[] = date("H:i", $start);
                                 $start += $step;
                                }
                               foreach($arr_work as $hour){
                                 $reserved = false;
                                 $val = $date->format("Y-m-d").' '.$hour;
                                if(isset($this->reserved_time) && !empty($this->reserved_time_to)){
                                 $a1 = new ArrayIterator($this->reserved_time);
                                            $a2 = new ArrayIterator($this->reserved_time_to);

                                            $it = new MultipleIterator;
                                            $it->attachIterator($a1);
                                            $it->attachIterator($a2);

                                            foreach($it as $e) {
                                 $break_start = strtotime($e[0]);
                                 $break_end = strtotime($e[1]);
                                 $arr_reserv = array();
                                  while($break_start <= $break_end){
                                    $arr_reserv = date("Y-m-d H:i", $break_start);
                                     $break_start += $step;
                                     if($val == $arr_reserv){
                                     $reserved = true;
                                     }
                                  }
                                  }
                               }   
                                        if(isset($this->stock_time) && !empty($this->stock_time_to)){
                                 $s1 = new ArrayIterator($this->stock_time);
                                            $s2 = new ArrayIterator($this->stock_time_to);
                                           
                                            $iter = new MultipleIterator;
                                            $iter->attachIterator($s1);
                                            $iter->attachIterator($s2);

                                            foreach($iter as $st) {
                                 $stock_start = strtotime($st[0]);
                                 $stock_end = strtotime($st[1]);
                                  $arr_stock = array();
                                  while($stock_start <= $stock_end){
                                    $arr_stock = date("Y-m-d H:i", $stock_start);
                                     $stock_start += $step;
                                     if($val == $arr_stock){
                                     $reserved = true;
                                     }
                                  }
                                  }
                               }       
                                      $master = JFactory::getApplication()->input->post->get('master', '');
                                    var_dump($master);
                                               $inp_id = str_replace(array('.', ' ', ':'), '-', $val);
                                    if(!$reserved){
                                       echo '<input type="radio" id="'.$inp_id.'-00" name="time" value="'.$val.'">';
                                       echo '<label for="'.$inp_id.'-00" class="btn-select'.$reserved.'">'.$hour.'</label>';
                                    }
                                    else echo '<label class="btn-select reserved">'.$hour.'</label>';
                                 }?>
                                        </p>
                              <?php else:?>
                                           <span class="line-no"></span>
                                        <?php endif;?>
                                    </div>
                                    <?php $date->modify('+1 DAY');
                              }?>
                                </div>
                            </div>
                            <div class="calc__btn">
                                <div class="btn-next">Далее</div>
                                <button type="button" class="close__btn" data-dismiss="modal">Отмена</button>
                            </div>
                        </div>


                        <div class="screen screen2">
                            <div class="calc__body">
                                <h2>Новая запись</h2>
                                <div class="zapis__data">
                                    <span class="zapis__data-time">Дата: <b id="req_date"></b></span>
                                    <span class="zapis__data-time">Время: <b id="req_time"></b></span>
                                    <div class="zapis__data-price-wrap"></div>
                                    <b class="zapis__data-result"></b>
                                    <textarea name="note" class="zapis__data-textarea" placeholder="Комментарий (необязательно)"></textarea>
                                </div>
                                <div class="calc__btn">
                                    <div class="btn-next">Далее</div>
                                    <button class="close__btn" type="button" onclick="jQuery('.screen').hide();jQuery(this).closest('.screen').prev().show();" >Назад</button>
                                </div>
                            </div>

                        </div>
                        <div class="screen screen3">
                            <div class="calc__body">
                                <h2>Изменение записи</h2>
                                <div class="form__finish">
                                </div>
                                <div class="calc__btn">
                                    <div class="btn-next">Изменить запись</div>
                                    <button class="close__btn" type="button" onclick="jQuery('.screen').hide();jQuery(this).closest('.screen').prev().show();">Назад</button>
                                </div>
                            </div>
                        </div>
                        <div class="screen screen4">
                     <div class="calc__body">
                        <label class="succes-round">Запись изменена</label>
                        <div class="calc__btn">
                           <div class="btn-fin" data-dismiss="modal">Закрыть</div>
                                </div>
                     </div>
                  </div>
                      <input type="hidden"  id="id" class="masid" name="master_id" value="" />
                     <input id="zapis__data-s-id" type="hidden"  class="svcid" name="svc_id" value="" />
                     <input id="zapis__data-t-id" type="hidden"  class="tagid" name="tag_id" value="" />
                     <input id="zapis__data-s-nm" type="hidden"  class="svcname" name="svc_name" value="" />
                     <input id="time_sum" type="hidden" class="time_sum" name="time_sum" value="" />
                     
                     <?php echo JHtml::_('form.token');?>
                  </form>
               </div>
                </div>
            </div>
        </div>

         <!-- Modal DELETE-->
        <div class="modal fade" id="del" role="dialog" aria-labelledby="exampleModalLabel" tabindex="-1"  aria-hidden="true">
            <div class="modal-dialog modal-dialog-centered" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                        <div class="modal-body">
                  <h2>Отмена записи</h2>
               <form id="del-form" method="POST" action="/">
                                <div class="del__btn">
                                    <div class="btn-del">Отменить запись</script></div>
                                </div>
                       
                        </div>
                       <input type="hidden"  class="masid" name="master_id" value="0" />
                            <input id="del__data-time" type="hidden"  class="svctime" name="time" value="0" />
                     <input id="del__data-t-id" type="hidden"  class="tagid" name="tag_id" value="0" />
                     <input id="del__data-s-nm" type="hidden"  class="svcname" name="svc_name" value="" />
                     <input id="time_sum" type="hidden" class="time_sum" name="time_sum" value="" />
                     <?php echo JHtml::_('form.token');?>
               </form>
            </div>
            </div>
        </div>
               
 

 
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Лучше создать модуль под вашу модалку .
Вы имеете в виду, что айдишник будет передаваться через сом_аякс в модуль, а уже модуль по айдишнику выведет расписание? Вариант!
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Еще прямые AJAX запросы блокируются запретом
Код
<?php defined('_JEXEC') or die;
Закоментируйте- и проверьте
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Еще прямые AJAX запросы блокируются запретом
Код
<?php defined('_JEXEC') or die;
Закоментируйте- и проверьте
Да, проверял. Отдает ошибку 500. Joomla без этой директивы вообще закрывает доступ к файлу. Если с ней, то код 200, но succes: alert(data) пустое. Если с defined('_JEXEC') or die('Restricted access'), то алерт отдает 'Restricted access'.
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Я так понял, что в Joomla AJAX запросы проходят только по системным ссылкам типа ?option=com_mycomponent&view=orders&view=modal но я не могу к модалке такую составить. Перепробовал много вариантов - в консоли 404
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Да, проверял. Отдает ошибку 500. Joomla без этой директивы вообще закрывает доступ к файлу.
500 это ошибка сервера. И если прямой запрос к файлу модалки, то нельзя использовать неопределенные константы Joomla . Например JPATH_SITE в
Код
require_once JPATH_SITE.'/templates/ryba/html/com_jsn/orders/temp.php';
п.с.
И этот код вызовет ошибку, потому что не подключен framework Joomla
Код
$db = JFactory::getDbo();
В модуле этих ошибок не будет или подключать framework Joomla в файлах .
« Последнее редактирование: 19.11.2021, 09:13:35 от draff »
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
500 это ошибка сервера. И если прямой запрос к файлу модалки, то нельзя использовать неопределенные константы Joomla . Например JPATH_SITE в
Код
require_once JPATH_SITE.'/templates/ryba/html/com_jsn/orders/temp.php';
п.с.
И этот код вызовет ошибку, потому что не подключен framework Joomla
Код
$db = JFactory::getDbo();
В модуле этих ошибок не будет или подключать framework Joomla в файлах .
В модалку поставил
Код
defined('_JEXEC');
Изменил запрос, добавил contentType и сообщение об ошибке
Код
var url = '/templates/ryba/html/com_jsn/orders/default_modal.php';
         
         $.ajax({
         url: url,
         data: {'master': master_id},
         type: "post",
         contentType: "application/json, charset: utf-8",
         cache: false,
         success: function(data) {
         alert('SUCCESS:  '+data);
         console.log("Ответ сервера:\n" + data); 
            },
         error: function(error) {
         alert('ERROR:  '+error);
         console.log( "ERROR:", error );
            }
         });

Данные форм в консоли показывает верное значение, но в ответе сервера отдает  HTML модалки...
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Лучше создать модуль под вашу модалку .
Пошел путем, который Вы порекомендовали - делаю модуль для модалки. В метод getAjax передаю ID записи без проблем, внутри метода делаю выборку из базы необходимых объектов, но вывести объекты в default не могу. В другом методе внутри класса модуля получить доступ к переменным метода getAjax также не могу - отдает null. Как полученнный id в методе getAjax передать другому методу внутри класса?
« Последнее редактирование: 22.11.2021, 15:33:34 от coolplaymaster »
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
В метод getAjax передаю ID записи без проблем, внутри метода делаю выборку из базы необходимых объектов, но вывести объекты в default не могу.
Return возвращает данные, их видно в тулс браузера Сеть  ?
Делайте вызов другого метода с передачей параметров из getAjax или сессией .
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Return возвращает данные, их видно в тулс браузера Сеть  ?
Делайте вызов другого метода с передачей параметров из getAjax или сессией .
Да, в консоли возвращает полученные объекты. Но передать из в другой метод этого же класса не могу. У меня в default HTML самого окна мне туда нужен id, чтобы циклами вывести расписание. Создаю внутри класса метод getWorks, в него предаю значение id добавляю в mod_modal.php  $id = ModModalHelper::getWorks($params); в defaul.php пытаюсь вывести echo $id значение null
Пробовал создать дочерний класс с методом, в котором пытался получить экземпляр класса $obj = new ModModalHelper(); $obj->id; выдает ошибку контекста. Вот мой хелпер
Код
<?php  defined('_JEXEC') or die;

class ModModalHelper
{
    function getAjax()
    {
        $jinput = JFactory::getApplication()->input;
        $master = $jinput->getInt('master_id');
       
        $db = JFactory::getDbo();
       
        $fields = array('work_day', 'work_from', 'work_to');
        $query = $db->getQuery(true);
        $query
        ->select($db->quoteName($fields))
        ->from($db->quoteName('#__jsn_users'))
        ->where($db->quoteName('id') . ' = ' . $master);
        $db->setQuery($query);
        $works = $db->loadObjectList();
       
       
        $fields = array('time', 'time_to');
        $query = $db->getQuery(true);
        $query
        ->select($db->quoteName($fields))
        ->from($db->quoteName('#__jsn_orders'))
        ->where($db->quoteName('master_id') . ' = ' . $master);
        $db->setQuery($query);
        $orders = $db->loadObjectList();
       
       
        $fields = array('time', 'time_to');
        $query = $db->getQuery(true);
        $query
        ->select($db->quoteName($fields))
        ->from($db->quoteName('#__jsn_stocks'))
        ->where($db->quoteName('master_id') . ' = ' . $master);
        $db->setQuery($query);
        $stocks = $db->loadObjectList();
       
       
        $schedule = array($works, $orders, $stocks);
        return $schedule;   
    }
    /* public function getWorks($params){
        echo "HUETA";
    } */
}
class RenderModal extends ModModalHelper{
    function getWorks($params){
        $render = new ModModalHelper();
        echo $render->schedule;
    }
}
?>
Ответ в тулс то что нужно. Но как его передать в дефаулт?
Код
{
    "success": true,
    "message": null,
    "messages": null,
    "data": [
        [
            {
                "work_day": "[\"2\",\"3\",\"4\",\"7\"]",
                "work_from": "8.45",
                "work_to": "18.45"
            }
        ],
        [
            {
                "time": "2021-11-23 08:45:00",
                "time_to": "2021-11-23 09:30:00"
            }
        ],
        []
    ]
}
« Последнее редактирование: 22.11.2021, 17:32:21 от coolplaymaster »
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Код
$schedule = array($works, $orders, $stocks);
может
Код
$schedule = array_merge($works, $orders, $stocks);
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Код
$schedule = array($works, $orders, $stocks);
может
Код
$schedule = array_merge($works, $orders, $stocks);
Нет, не хочет передавать. Внутри метода переменная работает правильно и делает выборку из базы согласно своему значению, а наружу не передается ни сама переменная, ни полученные объекты.
« Последнее редактирование: 22.11.2021, 19:40:42 от coolplaymaster »
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
Пошел путем динамической подгрузки расписания аяксом. Передаю атрибут кнопки с ID поля в PHP обработчик, в моем случае это хелпер шаблона, в обрабочике получаю ID и делаю выборку из базы рабочих дней и расписание мастера, создаю циклы вывода и передаю это все в модальное окно через success. В результате выводится индивидуальное расписание, но не в том виде в каком надо. Вопрос как корректно передать HTML селекторы через AJAX.
my.js
Код
var url = "?option=com_ajax&template=ryba&format=raw";
         $.ajax({
            url: url,
            data: {"master": master_id},
         type: "post",
         cache: false,
         beforeSend: function(){
            $('.calendar__master-item').empty();
            },
         success: function(data) {
             $('.calendar__master-item').append(data);
         },
         error: function(error) {
         alert("ERROR:  "+error);
         console.log( "ERROR:", error );
            }
         });   
helper.php
Код
public static function getAjax(){
      $app = JFactory::getApplication()->input;
      $master = $app->getInt('master');
      $db = JFactory::getDbo();
      $fields = array('work_day', 'work_from', 'work_to');
       $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_users'))
      ->where($db->quoteName('id'). ' = ' . $master);
      $db->setQuery($query);
      $works = $db->loadObjectList();
     
     
      $fields = array('time', 'time_to');
      $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_orders'))
      ->where($db->quoteName('master_id'). ' = ' . $master);
      $db->setQuery($query);
      $orders = $db->loadObjectList();
     
     
      $fields = array('time', 'time_to');
      $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_stocks'))
      ->where($db->quoteName('master_id'). ' = ' . $master);
      $db->setQuery($query);
      $stocks = $db->loadObjectList();
     
     
      $date = JFactory::getDate();                           
      foreach(range(1, 14) as $day){
       
      echo '<span class="mas-date">'.$date->format("d.m.Y").'<b>'.mb_strtolower($date->format("D")).'.</b></span>';
        foreach($works as $work)
      foreach($orders as $order)
        foreach($stocks as $stock)
      echo '<p class="btns-m">';
     
       $start = strtotime($work->work_from);
      $end = strtotime($work->work_to);
                                 
      $step = 15 * 60;
      $arr_work = array();
       for($i = $start; $i <= $end; $i += $step){
      $arr_work[] = date("H:i", $start);
      $start += $step;
      }
      foreach($arr_work as $hour){
         $reserved = false;
            $val = $date->format('Y-m-d').' '.$hour;
      if(!empty($orders->time) && !empty($orders->time_to)){
            $a1 = new ArrayIterator($orders->time);
            $a2 = new ArrayIterator($orders->time_to);

            $it = new MultipleIterator;
            $it->attachIterator($a1);
            $it->attachIterator($a2);

            foreach($it as $e) {
            $break_start = strtotime($e[0]);
            $break_end = strtotime($e[1]);
            $arr_reserv = array();
      while($break_start <= $break_end){
            $arr_reserv = date("Y-m-d H:i", $break_start);
             $break_start += $step;
         if($val == $arr_reserv){
            $reserved = true;
            }
         }
        }
       }   
      if(!empty($stocks->time) && !empty($stocks->time_to)){
         $s1 = new ArrayIterator($stocks->time);
         $s2 = new ArrayIterator($stocks->time_to);
                                   
         $iter = new MultipleIterator;
         $iter->attachIterator($s1);
         $iter->attachIterator($s2);

       foreach($iter as $st) {
         $stock_start = strtotime($st[0]);
         $stock_end = strtotime($st[1]);
         $arr_stock = array();
      while($stock_start <= $stock_end){
          $arr_stock = date("Y-m-d H:i", $stock_start);
         $stock_start += $step;
      if($val == $arr_stock){
         $reserved = true;
         }
      }
      }
       }   
          $inp_id = str_replace(array('.', ' ', ':'), '-', $val);                             
         if(!$reserved){
         echo '<input type="radio" id="'.$inp_id.'" name="time" value="'.$val.'">';
         echo '<label for="'.$inp_id.'" class="btn-select'.$reserved.'">'.$hour.'</label>';
      }
         else echo '<label class="btn-select reserved">'.$hour.'</label>';
       }
         echo "</p>";
         echo "<span class='line-no'></span>";
            echo "</div>";
         $date->modify('+1 DAY');
         
      }
     
   }
Результат ajax http://vfl.ru/fotos/dd50b67237109647.html
А нужно так http://vfl.ru/fotos/c1cc810b37108827.html
« Последнее редактирование: 15.12.2021, 11:04:20 от coolplaymaster »
*

anatol81n

  • Захожу иногда
  • 82
  • 2 / 0
Пошел путем динамической подгрузки расписания аяксом. Передаю атрибут кнопки с ID поля в PHP обработчик, в моем случае это хелпер шаблона, в обрабочике получаю ID и делаю выборку из базы рабочих дней и расписание мастера, создаю циклы вывода и передаю это все в модальное окно через success. В результате выводится индивидуальное расписание, но не в том виде в каком надо. Вопрос как корректно передать HTML селекторы через AJAX.
my.js
Код
var url = "?option=com_ajax&template=ryba&format=raw";
         $.ajax({
            url: url,
            data: {"master": master_id},
         type: "post",
         cache: false,
         beforeSend: function(){
            $('.calendar__master-item').empty();
            },
         success: function(data) {
             $('.calendar__master-item').append(data);
         },
         error: function(error) {
         alert("ERROR:  "+error);
         console.log( "ERROR:", error );
            }
         });   
helper.php
Код
public static function getAjax(){
      $app = JFactory::getApplication()->input;
      $master = $app->getInt('master');
      $db = JFactory::getDbo();
      $fields = array('work_day', 'work_from', 'work_to');
       $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_users'))
      ->where($db->quoteName('id'). ' = ' . $master);
      $db->setQuery($query);
      $works = $db->loadObjectList();
     
     
      $fields = array('time', 'time_to');
      $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_orders'))
      ->where($db->quoteName('master_id'). ' = ' . $master);
      $db->setQuery($query);
      $orders = $db->loadObjectList();
     
     
      $fields = array('time', 'time_to');
      $query = $db->getQuery(true);
      $query
      ->select($db->quoteName($fields))
      ->from($db->quoteName('#__jsn_stocks'))
      ->where($db->quoteName('master_id'). ' = ' . $master);
      $db->setQuery($query);
      $stocks = $db->loadObjectList();
     
     
      $date = JFactory::getDate();                           
      foreach(range(1, 14) as $day){
       
      echo '<span class="mas-date">'.$date->format("d.m.Y").'<b>'.mb_strtolower($date->format("D")).'.</b></span>';
        foreach($works as $work)
      foreach($orders as $order)
        foreach($stocks as $stock)
      echo '<p class="btns-m">';
     
       $start = strtotime($work->work_from);
      $end = strtotime($work->work_to);
                                 
      $step = 15 * 60;
      $arr_work = array();
       for($i = $start; $i <= $end; $i += $step){
      $arr_work[] = date("H:i", $start);
      $start += $step;
      }
      foreach($arr_work as $hour){
         $reserved = false;
            $val = $date->format('Y-m-d').' '.$hour;
      if(!empty($orders->time) && !empty($orders->time_to)){
            $a1 = new ArrayIterator($orders->time);
            $a2 = new ArrayIterator($orders->time_to);

            $it = new MultipleIterator;
            $it->attachIterator($a1);
            $it->attachIterator($a2);

            foreach($it as $e) {
            $break_start = strtotime($e[0]);
            $break_end = strtotime($e[1]);
            $arr_reserv = array();
      while($break_start <= $break_end){
            $arr_reserv = date("Y-m-d H:i", $break_start);
             $break_start += $step;
         if($val == $arr_reserv){
            $reserved = true;
            }
         }
        }
       }   
      if(!empty($stocks->time) && !empty($stocks->time_to)){
         $s1 = new ArrayIterator($stocks->time);
         $s2 = new ArrayIterator($stocks->time_to);
                                   
         $iter = new MultipleIterator;
         $iter->attachIterator($s1);
         $iter->attachIterator($s2);

       foreach($iter as $st) {
         $stock_start = strtotime($st[0]);
         $stock_end = strtotime($st[1]);
         $arr_stock = array();
      while($stock_start <= $stock_end){
          $arr_stock = date("Y-m-d H:i", $stock_start);
         $stock_start += $step;
      if($val == $arr_stock){
         $reserved = true;
         }
      }
      }
       }   
          $inp_id = str_replace(array('.', ' ', ':'), '-', $val);                             
         if(!$reserved){
         echo '<input type="radio" id="'.$inp_id.'" name="time" value="'.$val.'">';
         echo '<label for="'.$inp_id.'" class="btn-select'.$reserved.'">'.$hour.'</label>';
      }
         else echo '<label class="btn-select reserved">'.$hour.'</label>';
       }
         echo "</p>";
         echo "<span class='line-no'></span>";
            echo "</div>";
         $date->modify('+1 DAY');
         
      }
     
   }
Результат AJAX http://vfl.ru/fotos/dd50b67237109647.html
А нужно так http://vfl.ru/fotos/c1cc810b37108827.html
сильно не вкупался в ваш код, вы пытаетесь рендерить HTML на беке, но мне кажется ваш подход не совсем верный. Я бы сделал так:
на беке формировал только массив данных с расписанием, AJAX бы его забирал.
на фронте уже разбирал этот массив данных и рендерил нужный HTML джаваскриптом.
*

coolplaymaster

  • Захожу иногда
  • 62
  • 1 / 0
  • Быстро, весело, спортивно.
сильно не вкупался в ваш код, вы пытаетесь рендерить HTML на беке, но мне кажется ваш подход не совсем верный. Я бы сделал так:
на беке формировал только массив данных с расписанием, AJAX бы его забирал.
на фронте уже разбирал этот массив данных и рендерил нужный HTML джаваскриптом.
Спасибо за подсказку! Буду пробовать.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Joomla 3 не пускает в админку (просто перезагружается страница) (гуглил, нашёл решение, не помогло)

Автор lifelover2b

Ответов: 11
Просмотров: 3697
Последний ответ 05.06.2025, 04:48:29
от andrey222
По поводу сессий Joomla 3

Автор azm1n

Ответов: 0
Просмотров: 457
Последний ответ 25.05.2025, 09:26:17
от azm1n
Стоит ли ставить плагин rel="canonical" на Joomla 3

Автор azm1n

Ответов: 2
Просмотров: 641
Последний ответ 09.05.2025, 12:39:18
от azm1n
Вывести поля профиля Joomla

Автор romagromov

Ответов: 11
Просмотров: 1692
Последний ответ 28.04.2025, 10:25:44
от sivers
Максимальная версия PHP для Joomla 3

Автор Dram

Ответов: 8
Просмотров: 2048
Последний ответ 27.03.2025, 10:40:29
от wishlight