Новости Joomla

Вышел WT Quick links v.2.4.0 - релиз модуля для Joomla

Вышел WT Quick links v.2.4.0 - релиз модуля для Joomla.Это модуль-конструктор для быстрого создания набора элементов. Это могут быть ссылки на компоненты Joomla, пункт меню или пользовательская ссылка. Есть условия для исключений показа элементов списка. Вы можете создавать собственные макеты вывода модуля, создавая таким образом почти всё, что угодно: от простого списка ссылок до стены фотографий на главную страницу или ссылки-теги для перелинковки категорий интернет-магазина, список FAQ, табы или аккордеоны. Модуль позволяет выводить изображения, адаптивные изображения, видео, адаптивные видео.v.2.4.0. Что нового?Добавлена поддержка новых компонентов. Добавлены новые типы ссылок и исключений для них: - Phoca Download, - Phoca Gallery, - RadicalMart (@radicalmart).Joomla 6. Успешно протестирована работа модуля на Joomla 6-alpha2.РазработчикамПроведён большой рефакторинг кода. Для типов ссылок созданы классы-драйверы. Теперь для того, чтобы добавить новый тип ссылки в модуль достаточно скопировать класс-образец из
modules/mod_wt_quick_links/src/Driver/Collection и наполнить его данными по образцу, а так же добавить необходимые языковые константы в панели администратора Joomla.Модуль бесплатный. Страница расширенияGitHub расширенияJoomla Extensions Directory👩‍💻 Подпишись на @joomlafeed.#joomla #разработка

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

👩‍💻 Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note"     name="your_note_for_user"     label="Заголовок примечания"     title="Альтернативный способ для заголовка"     description="Текст примечания"     class="col-12 alert alert-info"     heading="h1"     close="true"/>
heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён.Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле
<field type="systempluginstatus"      name="systempluginstatus"     addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>
-
type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:
<?php// namespace для атрибута addfieldprefixnamespace Joomla\Module\Wtquicklinks\Site\Fields;// нельзя напрямую обращаться к этому файлуdefined('_JEXEC') or die;// подключаем родительский класс для переопределенияuse Joomla\CMS\Form\Field\NoteField;use Joomla\CMS\Language\Text;use Joomla\CMS\Plugin\PluginHelper;// имя класса и имя файла точь-в-точьclass SystempluginstatusField extends NoteField{     protected $type = 'Systempluginstatus';     protected function getLabel()          {               // если плагин не включён               if(PluginHelper::isEnabled('system','wtquicklinks')) {                    // меняем свойства родительского класса                    $this->class = 'alert alert-danger w-100';                    $this->element['label'] = '⚠️ А-а-а-а!';                    $this->element['description'] = 'Плагин не включён!!';                    // и просто рендерим его с нашими свойствами                    return parent::getLabel();               }          // А иначе всё хорошо, скрываем поле из виду.          $this->parentclass = 'd-none';          return '';     }}
Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает.@webtolkru#joomla #php #webdev #разработка

Обновлена информация в Плане развития Joomla

👩‍💻 Обновлена информация в Плане развития Joomla.Здесь собрана информация о датах релизов, описаны принципы версионирования, указаны ответственные за релизы, а так же даты окончания поддержки релизов. Опираясь на эту информацию вы можете планировать развитие ваших интернет-проектов.👩‍💻 Что нового?⛔️ Joomla 4.Дата окончания исправления ошибок безопасности в версии 4.x - 14 октября 2025г. ⚠️ После этой даты Joomla 4 прекратит получать какие-либо обновления, в том числе безопасности - вообще. Рекомендуем обновить ваши сайты до актуальной Joomla 5.✅ Joomla 5.- Дата окончания исправления ошибок в версии 5.x - 13 октября 2026г.- Дата окончания исправления ошибок безопасности в версии 5.x - 12 октября 2027 года.- Текущая актуальная (на момент написания заметки) версия - 5.3.1.- Опубликовано расписание выхода релизов Joomla 5.4. Стабильный релиз ожидается 14 октября 2025 года.✅ Joomla 6.- Дата окончания исправления ошибок в версии 6.x - 17 октября 2028г.- Дата окончания исправления ошибок безопасности в версии 6.x - 16 октября 2029г.- Опубликовано расписание выхода релизов Joomla 6.0. Стабильный релиз ожидается 14 октября 2025 года.- Для разработчиков уже доступна Joomla 6.0.0-alpha1.✅ Joomla! Framework.Обновлена информация о Joomla! Framework - полноценном PHP-фреймворке для разработки. Он в версиях 1.х и 2.х был самостоятельным параллельным проектом, однако начиная с версии Joomla 4.0 стал её основой. Добавлена информация о Joomla! Framework 3.x, который вышел 6 октября 2023 года. Его можно использовать в тех случаях, когда вам в проекте не нужна CMS Joomla целиком.Подробнее на сайте Joomla-сообщества Joomlaportal.ru#joomla #community

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

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
Просмотров: 3727
Последний ответ 05.06.2025, 04:48:29
от andrey222
По поводу сессий Joomla 3

Автор azm1n

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

Автор azm1n

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

Автор romagromov

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

Автор Dram

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