Новости Joomla

Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать. На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla. Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора. Видео на YouTubeВидео на VK ВидеоВидео на RuTubeКомпонент на GitHub https://github.com/joomla-extensions/patchtester@joomlafeed#joomla #php #webdev #community

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6.2PageBuilder Toolkit - это специализированный плагин для конструктора страниц Yootheme Pro, содержит набор различных утилит для ускорения процесса работы и отладки макета, множественные улучшения в интерфейсе, включая поддержку dark mode, подсказки, быстрая смена разрешения в окне просмотра и много чего еще.v.1.6.2 Что нового?- Индикатор статусов: теперь не просто показывает состояние запросов, но и делает автоматические попытки их отправки при кратковременных сбоях в сети, а если это не помогло, то переводит конструктор в ручной режим, что позволяет сохранит макет и настройки темы прежде чем вы потеряете все, что было сделано с момента последнего сохранения- Подсветка ошибок в макете: плагин анализирует код страницы и может автоматически подсвечивать data атрибуты с кучей мусора, которые попадают в код страницы при копипасте из Figma в TinyMCE (пригодится для старых макетов, в текущей работе плагин сам очищает код мусора). Также есть подсветка семантических ошибок сборки - дубли h1 тега на странице и вложенных друг в друга заголовков.- Улучшена поддержка будущего релиза Yootheme Pro 5 и редактора CodeMirror 6Плагин для русскоязычных пользователей доступен в каталоге расширений SovMart и распространяется за символическую плату (100р). Разработчики Joomla расширений и партнеры автора могут получить плагин бесплатно.Для работы плагина необходим конструктор страниц Yootheme Pro.Разработчик плагина - участник нашего сообщества Александр Судьбинов (@alexrevo), член официальной группы поддержки Yootheme Pro. Страница расширенияОписание на сайте автора@joomlafeed#joomla #yootheme

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

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Здравствуйте!

собственно не могу понять почему в модели я не могу получить post или get данные которые я отправил из формы

Код
JFactory::getApplication()->input->get('search_title', '', 'post');
возвращает string(0) ""

нужно через контроллер передать эти данные?

подскажите пожалуйста, буду признателен!
« Последнее редактирование: 20.10.2014, 18:30:16 от b2z »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Post запрос в модели компонента
« Ответ #1 : 20.10.2014, 14:31:53 »
JFactory::getApplication()->input->post->get('search_title', '');
интернет-блог: http://websiteprog.ru
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #2 : 20.10.2014, 14:36:49 »
JFactory::getApplication()->input->post->get('search_title', '');
я просто тут на быструю руку писал и объект input пропустил
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Post запрос в модели компонента
« Ответ #3 : 20.10.2014, 14:39:40 »
я просто тут на быструю руку писал и объект input пропустил
То есть все ок? Или у Вас в коде JFactory::getApplication()->input->post->get('search_title', '') и не работает?
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #4 : 20.10.2014, 14:40:22 »
То есть все ок? Или у Вас в коде JFactory::getApplication()->input->post->get('search_title', '') и не работает?
угу(
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Post запрос в модели компонента
« Ответ #5 : 20.10.2014, 14:45:00 »
Код формы покажите!
Если у вас форма через XML формируется и выводится через $this->form->getInput('name') то у вас все елементы в мессиве jform будут!
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #6 : 20.10.2014, 14:48:15 »
Код формы покажите!
Если у вас форма через XML формируется и выводится через $this->form->getInput('name') то у вас все елементы в мессиве jform будут!

та не, модуль поиска по стороннему компоненту!


Код
<?php
$search_title = JFactory::getApplication()->input->get('search_title', '', 'post');
?>
<form id="mod-finder-searchform" class="search" method="post" action="/katalog-domov">
    <div class="ico" onclick="jQuery(this).parent('form').submit();"></div>
    <div class="finder">
        <fieldset name="search">
        <input onblur="if (this.value=='') this.value='<?=$search_title?>';" onfocus="if (this.value=='<?=$search_title?>') this.value='';" id="search_title" class="search-query input-medium" type="text" value="<?=$search_title?>" size="25" name="search_title">
        </fieldset>
    </div>
</form>

ковыряю чужой компонент, вот не могу понять почему в модели не видно ни post ни get
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #7 : 20.10.2014, 14:51:33 »
код модели для ясности картины
Код
<?php
defined('_JEXEC') or die;

class CatalogModelFrontpage extends JModelItem
{





    private function item()
    {

        $db = $this->getDbo();
        $query = $db->getQuery(true);
        $published = $this->getState('filter.published', 1);
        $archived = $this->getState('filter.archived', 2);
        $app = JFactory::getApplication();
        $filter_post = $app->input->get('filter', '', 'post');

        $search_title = JFactory::getApplication()->input->post->get('search_title', '');

        var_dump($search_title);

        $sort = $app->input->get('sort', '', 'post');

        if (!empty($filter_post)) {

            $filter = array();

            for ($i = 0; $i < count($filter_post); $i++) {

                if (!in_array('0', $filter_post[$i])) {

                    if (is_numeric($filter_post[$i]['value'])) {

                        $filter[$filter_post[$i]['name']] = $filter_post[$i]['value'];
                    }
                }
            }

        }

        $query->select(
            'a.id AS id, ' .
            'a.title AS title, ' .
            'a.catid AS catid, ' .
            'a.unique_code AS unique_code, ' .
            'a.price AS price, ' .
            'a.floor AS floor, ' .
            'a.area AS area, ' .
            'a.params AS params, ' .
            'a.images AS images, ' .
            'a.options AS options, ' .
            'a.description AS description, ' .
            'm.id AS mid '

        );

        $query->from('#__catalog AS a')
            ->join('LEFT', '#__menu AS m ON a.title = m.title');

        $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')')
            ->where('(a.state = ' . (int)$published . ' OR a.state = ' . (int)$archived . ')');

        if (!empty($filter_post)) {

            $query->where('(a.price >= ' . (int)$filter['price-min'] . ' AND a.price <= ' . (int)$filter['price-max'] . ')')
                ->where('(a.floor >= ' . (int)$filter['floor-min'] . ' AND a.floor <= ' . (int)$filter['floor-max'] . ')')
                ->where('(a.area >= ' . (int)$filter['area-min'] . ' AND a.area <= ' . (int)$filter['area-max'] . ')');
        }

        if(!empty($search_title)) {
            $query->where('a.title LIKE '.$db->Quote('%'.$db->escape($search_title, true).'%').'');
        }


        if (!empty($sort)) {

            $query->order('a.' . $sort);
        }

        $db->setQuery($query);

        return $db->loadObjectList();
    }
    
    private function newArray(){

         $array = array();
         $field = array();

         $rows = $this->item();

         for($i = 0; $i < count($rows); $i++){

                $params[$i]     = json_decode($rows[$i]->params, true);
                $images[$i]     = json_decode($rows[$i]->images, true);
                $options[$i]    = json_decode($rows[$i]->options, true);

                unset($params[$i]['stock-ico']);


                $field[$i] = array(
                    'id'            => $rows[$i]->id,
                    'title'         => $rows[$i]->title,
                    'catid'         => $rows[$i]->catid,
                    'unique_code'   => $rows[$i]->unique_code,
                    'price'         => $rows[$i]->price,
                    'floor'         => $rows[$i]->floor,
                    'area'          => $rows[$i]->area
                    );

                $array[$i] = array_merge($field[$i],$params[$i],$images[$i],$options[$i]);

            }

            return $array;
    }
    
    private function sortString($array){
        
        $app           = JFactory::getApplication();
        $filter_post   = $app->input->get('filter', '', 'post');
        
        $filter = array();
        $list   = array();
        $result = array();
        
        for($i = 0; $i < count($filter_post); $i++){
            
            if(!in_array('0', $filter_post[$i])){
                
                if(!is_numeric($filter_post[$i]['value'])){
                    
                    $filter[$filter_post[$i]['name']] = $filter_post[$i]['value'];    
                }  
            }
        }
        
        if(isset($filter)){
            
            $filter_count = count($filter);
            
            for($i = 0; $i < count($array); $i++){
                
                //Находим схождение массивов $filter и $array[$i]
                $comparison = array_intersect($filter,$array[$i]);
                    
                if(isset($comparison)){
                
                    foreach($comparison as $compare){
                        //Проверяем искомое значение в массиве $filter
                        if(in_array($compare,$filter)){
                            //Ищем ключи в массиве $filter
                            $key = array_search($compare,$filter);
                            //Создаем массив из id, совпадающих со значениями из $filter
                            if($filter[$key] == $array[$i][$key]){
          
                                $list[] = $array[$i]['id'];
                            }
                        }
                    }
                }
            }
        }
                
        //Подсчитать количество id в массиве $list
        //Возвращаем массив ключами которого являются значения массива $list
        if(isset($list)){
            
            $values_count = array_count_values($list);
        }else{
            
            exit();
        }
        
        //Создаем массив схожими поля из $filter и $array  
        foreach($values_count as $key => $values){
            
            if($filter_count == $values){
                
              $result[] = $key;  
            }
        }
        
        if(!empty($result)){
            
            for($i = 0; $i <= count($array); $i++){
                
                if(isset($array[$i])){  
                  
                    foreach($result as $r){
                  
                        if(array_search($r,$array[$i])){
                    
                           if($array[$i]['id'] == $r){
                              
                               $output[] = $array[$i];
                          }
                        }
                    }    
                }  
            }
      
            return $output;
            
        }elseif(empty($filter)){

            return $array;  
        }
    }
              
    function getView()
    {

        $app = JFactory::getApplication();
        $filter_post = $app->input->get('filter', '', 'post');
        $search_title = $app->input->get('search_title', '', 'post');
        $search = $app->input->get('search', '', 'post');

        if (!empty($filter_post)) {
            return $this->sortString($this->newArray());
        } else {
            return $this->newArray();
        }

    }
      
    function getCategory(){
            
            $db             = $this->getDbo();
            $query          = $db->getQuery(true);
            $app            = JFactory::getApplication();
            $itemid         = $app->input->getInt('Itemid', '');
            $published      = $this->getState('filter.published',1);
            $archived       = $this->getState('filter.archived',2);
                        
            $query->select(
'a.id AS id, '.
'a.title AS title, '.
                        'a.link  AS link, '.
'a.params AS params '
);
            
            $query->from('#__menu AS a');
            
            $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()). ',' . $db->quote('*'). ')')
                ->where('(a.published = ' . (int) $published . ' OR a.published = ' . (int) $archived . ')')
                ->where('parent_id = "'.$itemid.'"');
            $query->order('a.lft');
            
            $db->setQuery($query);
            return $db->loadObjectList();
        }
        
        
    function getFilter()
    {

        $db = $this->getDbo();
        $query = $db->getQuery(true);
        $doc = JFactory::getDocument();
        $published = $this->getState('filter.published', 1);
        $archived = $this->getState('filter.archived', 2);

        $query->select(
            'a.id AS id, ' .
            'a.title AS title, ' .
            'a.catid  AS catid, ' .
            'a.type AS type, ' .
            'a.params AS params,' .
            'a.hidden AS hidden, ' .
            'a.filter AS filter'
        );

        $query->from('#__catalog_customoptions AS a');

        $query->where('(a.published = ' . (int)$published . ' OR a.published = ' . (int)$archived . ')');

        $query->order('a.ordering ASC');
        $db->setQuery($query);
        return $db->loadObjectList();
    }
        
}
?>

причем там есть формочка filter отправляется через AJAX, ее данные видно
« Последнее редактирование: 20.10.2014, 14:57:52 от saharin88 »
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Post запрос в модели компонента
« Ответ #8 : 20.10.2014, 15:21:54 »
А значение вообще уходит? В Developer tools браузера убедитесь, что значение ушло на сервер. Если ушло, то сделайте var_dump($app->input->post) и посмотрите, пришло ли оно.
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #9 : 20.10.2014, 15:36:14 »
А значение вообще уходит? В Developer tools браузера убедитесь, что значение ушло на сервер. Если ушло, то сделайте var_dump($app->input->post) и посмотрите, пришло ли оно.

значения полей уходят,, + в начале компонента видно еще данные
http://screencast.com/t/bCluW9fHTM
http://screencast.com/t/Mpd4whZ5rx

а когда посмотреть (var_dump($app->input->post) ) в методе(getView ) модели, данных уже нет...

получается где то внутри теряются данные

по модели не видно где бы перезатералось что то?

контроллера для этого view там нет
« Последнее редактирование: 20.10.2014, 15:39:33 от saharin88 »
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Post запрос в модели компонента
« Ответ #10 : 20.10.2014, 15:57:39 »
Сделайте дамп в модели, после $filter_post = $app->input->get('filter', '', 'post');
*

saharin88

  • Захожу иногда
  • 291
  • 20 / 1
  • JoomWork
Re: Post запрос в модели компонента
« Ответ #11 : 20.10.2014, 18:09:49 »
большое спасибо всем!
там я не посмотрел хорошо, а вывод реализован на AJAX, и естественно нужно было при отправке AJAX запроса добавить мои данные...
еще раз, всем большое спасибо, за то что уделили время!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создание компонента для табеля рабочего времени

Автор sashahz

Ответов: 7
Просмотров: 842
Последний ответ 12.04.2021, 11:12:11
от sashahz
Вызов формы компонента в pop-up, при клике по ссылке из любого места

Автор SkyAn

Ответов: 1
Просмотров: 727
Последний ответ 01.03.2021, 04:08:48
от gartes
[РЕШЕНО] Дублирование при создании

Автор platonische

Ответов: 7
Просмотров: 1335
Последний ответ 12.02.2021, 11:24:26
от platonische
[РЕШЕНО] onChange в админке на field modal

Автор platonische

Ответов: 1
Просмотров: 669
Последний ответ 30.01.2021, 16:40:45
от platonische
Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 3353
Последний ответ 23.01.2021, 07:55:56
от hmr