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

coolplaymaster

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

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

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

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

NewUsers

  • Живу я здесь
  • 2289
  • 207 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Можно увидеть код который вы используете HTML и JS
Занимаюсь создание расширений для Joomla 3.9.x или выше | Доработка и настройка сайтов. Работаю по факту (без всяких предоплат). Оплата только на ЮMoney (бывшие Яндекс.Деньги). Помогу с переездом на PHP 7.x и исправлю ошибки PHP.
Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

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

  • Гуру
  • 5803
  • 433 / 7
  • ищу работу
*

coolplaymaster

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

draff

  • Гуру
  • 5803
  • 433 / 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

  • Гуру
  • 5803
  • 433 / 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

  • Гуру
  • 5803
  • 433 / 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

  • Гуру
  • 5803
  • 433 / 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 джаваскриптом.
Спасибо за подсказку! Буду пробовать.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

При срабатывании ajax появляетсся div id="system-message-container"

Автор androv77

Ответов: 1
Просмотров: 157
Последний ответ 17.11.2022, 11:50:42
от androv77
Массовый импорт статей из Excel в Joomla

Автор koskanalya

Ответов: 1
Просмотров: 245
Последний ответ 05.11.2022, 14:15:34
от antony2606
Доска объявлений / маркетплейс по продаже, аренде спецтехники - на Joomla?

Автор Dannik

Ответов: 5
Просмотров: 207
Последний ответ 31.10.2022, 16:04:25
от marksetter
Как использовать карты svg в Joomla?

Автор chen

Ответов: 3
Просмотров: 276
Последний ответ 24.10.2022, 00:16:50
от gartes
[Решено] Отключить Mootols, Jquery и Bootstrap в Joomla 3

Автор Pazys

Ответов: 126
Просмотров: 89416
Последний ответ 21.10.2022, 22:25:23
от Alex Kop