Новости Joomla

Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5

👩‍💻 Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5.В Joomla для выполнения внешних запросов из PHP к сторонним API используется класс Joomla\Http\Http напрямую или же Joomla\Http\HttpFactory, который возвращает для работы преднастроенный по умолчанию класс Http. О работе с HTTP-запросами подробно рассказывалось в статье 2021 года Создание внешних запросов с использованием HttpFactory (Joomla). Некоторые изменения касаются работы с ответами на запросы. Например, наш запрос:
use Joomla\Http\HttpFactory;$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);$response = $http->get('https://any-url.ru/api/any/endpoint');
Раньше можно было получить код ответа или тело ответа как свойство $response - $response->code или $response->body. Однако, Joomla, начиная с Joomla 4 во многом переходит на стандарты PSR. В частности для работы с HTTP-ответами - на PSR-7. Также хорошая статья на Хабре о PSR-7: PSR-7 в примерах.
Прямое обращение к свойствам code, headers, body объявлено устаревшим в Joomla 6.0.0 и обещают удалить в Joomla 7.0.0.
Вместо этого нужно работать с HTTP-ответом по стандартам PSR-7. Код ответа.Было $response->code. Стало $response->getStatusCode().Заголовки ответа.Было $response->headers. Стало $response->getHeaders().Тело ответа.Было $response->body. Стало (string)$response->getContents().В тело ответа теперь приходит не строка, а поток - объект класса Laminas\Diactoros\Stream. Поэтому его нужно привести к строке (если это json, к примеру): (string)$response->getContents(). Чаще всего в коде Joomla встречается именно такой вариант. Однако, есть и вариант с перемещением указателя чтения на начало потока:
// Получили ответ в виде потока$stream = $response->getBody();// "перемотали" на начало$stream->rewind();// Получили строковый ответ$json = $stream->getContents();
В итоге результат одинаковый.@joomlafeed#joomla #разработка #php

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!

Quantum Manager нужен сообществу, а автору нужна ваша поддержка!Файловый менеджер Quantum — одно...

Файловый менеджер Quantum — одно из самых популярных решений для Joomla, созданное разработчиком из сообщества Joomla, Дмитрием Цымбалом (@tsymbalmitia). Он делает Quantum удобным, безопасным и современным, обновляет его, исправляет уязвимости и отвечает пользователям — всё это в свободное от основной работы время.

Теперь настал момент для следующего шага: развитие проекта требует больше времени и ресурсов.

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

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Кэширование вручную
« : 30.01.2010, 16:47:44 »
Как можно кэшировать запрос к базе,чтобы не выполнять его в другой раз...например в модуле... я добавил в него (в xml) функцию кэша,но в отладке некоторые запросы не кешируются... пример из отладки

Цитировать
/modules/mod_news_pro_gk1/gk_classes/joomla.news.class.php:482
/modules/mod_news_pro_gk1/helper.php:295
Execute time:8.0E-5 sec.
SELECT
                                s.`filename` AS filename,
                                s.`article` AS artID       
                       
  FROM
                                jos_gk3_photoslide_slides AS s
                       
  LEFT JOIN
                                jos_gk3_photoslide_groups AS g
                               
  ON
                                s.group_id = g.id
                       
  WHERE
                                s.access <= 0
                               
  AND
                                s.published = 1
                               
  AND
                                g.type = "News Show Pro"
что надо добавить в код этого php файла ,чтобы он начал кэшировать запросы?
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #2 : 30.01.2010, 17:20:59 »
попровал выполнить то ,что написано в статье в примере  (кстати оригинал http://docs.joomla.org/Using_caching_to_speed_up_your_code)
,но что-то с классом не так....
- Fatal error: Class 'JProfiler' not found in /home/users/r/rubasket/domains/rubasket.org.ru/components/com_testcache/testcache.php on line 27
что это может быть?
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: Кэширование вручную
« Ответ #3 : 30.01.2010, 17:28:32 »
попровал выполнить то ,что написано в статье в примере  (кстати оригинал http://docs.joomla.org/Using_caching_to_speed_up_your_code)
,но что-то с классом не так....
- Fatal error: Class 'JProfiler' not found in /home/users/r/rubasket/domains/rubasket.org.ru/components/com_testcache/testcache.php on line 27
что это может быть?
я не знаю конечно как и чего ты там делал, но там написано все правильно. И ссылка на источник к тоже есть.
класс объявил?
Код
$profiler = new JProfiler();
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #4 : 30.01.2010, 17:33:29 »
Цитировать
<?php
 
class TestClass {
 
    function testMethod( $table ) {
 
        // Get a reference to the global database object.
        $db = & JFactory::getDBO();
 
        // Execute the same database query 250 times.
        for( $i=0; $i<250; $i++) {
            $db->setQuery( "SELECT * FROM #__$table" );
            $rows = $db->loadObjectList();
        }
 
        return $rows;
    }
}
 
// Determine which database table to query.
$table = JRequest::getVar( 'table', 'content' );
 
// Get a reference to the global cache object.
$cache = & JFactory::getCache();
 
// Run the test without caching.
$profiler = new JProfiler();
$rows = TestClass::testMethod( $table );
echo $profiler->mark( ' without caching' );
 
// Run the test with caching.
$profiler = new JProfiler();
$rows  = $cache->call( array( 'TestClass', 'testMethod' ), $table );
echo $profiler->mark( ' with caching' );
 
?>
всё  я прописал...
или чего-то не хватает?
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #5 : 30.01.2010, 17:51:01 »
УВ. Smokerman ,а в строке
Цитировать
$rows  = $cache->call( array( 'TestClass', 'testMethod' ), $table );
что будет вместо $rows и $table  для кода
Цитировать
$query_news = '
         SELECT DISTINCT
            cats.title AS cat,
            '.((($config['username'] != 2)? 'users.'.(($config['username'] == 1)? 'username':'name') : 'content.created_by_alias')).' AS author,
            cats.section AS SID,
            content.title AS title,
            content.introtext AS text,
            content.created AS date,
            content.publish_up AS date_publish,
             content.images AS images,
            content.id as IID,
            CASE WHEN CHAR_LENGTH(content.alias)
               THEN CONCAT_WS(":", content.id, content.alias)
                  ELSE content.id END as ID,
            CASE WHEN CHAR_LENGTH(cats.alias)
               THEN CONCAT_WS(":", cats.id, cats.alias)
                  ELSE cats.id END as CID                
         FROM
            #__content AS content
            LEFT JOIN
               #__categories AS categories
               ON categories.id = content.catid
            
            LEFT JOIN
               #__sections AS sections
               ON sections.id = content.sectionid
            LEFT JOIN
               #__menu AS menu
               ON menu.componentid = content.id
            LEFT JOIN
               #__users AS users
               ON users.id = content.created_by
            LEFT JOIN
               #__content_frontpage AS frontpage
               ON content.id = frontpage.content_id           
            LEFT JOIN
               #__categories AS cats
               ON content.catid = cats.id    
         WHERE
            content.state = 1'.((!$noauth && $config['unauthorized'] == 0)? '
               AND categories.access <= ' .(int) $aid . '
               AND content.access <= '.(int) $aid : '').'
                AND categories.published = 1 
            AND ( content.publish_up = '.$db->Quote($nullDate).'
               OR content.publish_up <= '.$db->Quote($now).' )
               AND ( content.publish_down = '.$db->Quote($nullDate).'
               OR content.publish_down >= '.$db->Quote($now).' )
            AND ( '.$sql_where.' )
            '.$frontpage_con.'
         ORDER BY
            '.$order_options.'
         LIMIT
            '.$config['startposition'].','.($amount + (int)$config['startposition']).';
?
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: Кэширование вручную
« Ответ #6 : 30.01.2010, 18:01:01 »
да я откуда знаю :) ты привел вообще sql запрос, который ничего не говорит.
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #7 : 30.01.2010, 18:16:51 »
извини пожалуйста,просто я не дошёл ещё до функций в PHP );
а ,вот нашёл всю функцию ,входящую в класс class GK_JoomlaNewsNP11...но вот как тут что-то сделать..аж глаза разбегаются...

Цитировать
function getNewsStandardMode($categories, $sql_where, $config, $amount)
   {   
      // mainframe
      global $mainframe;
      // Arrays for content
      $content_id = array();
      $content_iid = array();
      $content_cid = array();
      $content_title = array();
      $content_text = array();
      $content_images = array();
      $content_date = array();
      $content_author = array();
      $content_catname = array();
      $content_sid = array();
      $news_amount = 0;
      // Initializing standard Joomla classes and SQL necessary variables
      $db =& JFactory::getDBO();
      $user =& JFactory::getUser();
      $aid = $user->get('aid', 0);
      $contentConfig = &JComponentHelper::getParams( 'com_content' );
      $noauth   = $contentConfig->get('show_noauth');
      $date =& JFactory::getDate();
      $now  = $date->toMySQL();
      $nullDate = $db->getNullDate();
      // Overwrite SQL query when user set IDs manually
      if($config['IDs'] != '')
      {
         // initializing variables
         $sql_where = '';
         $ids = explode(',', $config['IDs']);
         //
         for($i = 0; $i < count($ids); $i++ )
         {   
            // linking string with content IDs
            $sql_where .= ($i != 0)? ' OR content.id = '.$ids[$i] : ' content.id = '.$ids[$i];
         }
      }
      // if some data are available
      if(count($categories) > 0)
      {
         // when showing only frontpage articles is disabled
         if($config['only_frontpage'] == 0)
         {
            $frontpage_con = ($config['news_frontpage'] == 0)? ' AND frontpage.content_id IS NULL ' : '';
         }
         else // when showing only frontpage articles is enabled
         {
            $frontpage_con = ' AND frontpage.content_id IS NOT NULL ';
         }
         // Ordering string
         $order_options = '';
         // When sort value is random
         if($config['news_sort_value'] == 'random')
         {
            $order_options = ' RAND() ';
         }
         else // when sort value is different than random
         {
            if($config['news_sort_value'] != 'fordering') $order_options = ' content.'.$config['news_sort_value'].' '.$config['news_sort_order'].' ';
            else $order_options = ' frontpage.ordering '.$config['news_sort_order'].' ';
         }
         // creating SQL query

         $query_news = '
         SELECT DISTINCT
            cats.title AS cat,
            '.((($config['username'] != 2)? 'users.'.(($config['username'] == 1)? 'username':'name') : 'content.created_by_alias')).' AS author,
            cats.section AS SID,
            content.title AS title,
            content.introtext AS text,
            content.created AS date,
            content.publish_up AS date_publish,
             content.images AS images,
            content.id as IID,
            CASE WHEN CHAR_LENGTH(content.alias)
               THEN CONCAT_WS(":", content.id, content.alias)
                  ELSE content.id END as ID,
            CASE WHEN CHAR_LENGTH(cats.alias)
               THEN CONCAT_WS(":", cats.id, cats.alias)
                  ELSE cats.id END as CID                
         FROM
            #__content AS content
            LEFT JOIN
               #__categories AS categories
               ON categories.id = content.catid
            
            LEFT JOIN
               #__sections AS sections
               ON sections.id = content.sectionid
            LEFT JOIN
               #__menu AS menu
               ON menu.componentid = content.id
            LEFT JOIN
               #__users AS users
               ON users.id = content.created_by
            LEFT JOIN
               #__content_frontpage AS frontpage
               ON content.id = frontpage.content_id           
            LEFT JOIN
               #__categories AS cats
               ON content.catid = cats.id    
         WHERE
            content.state = 1'.((!$noauth && $config['unauthorized'] == 0)? '
               AND categories.access <= ' .(int) $aid . '
               AND content.access <= '.(int) $aid : '').'
                AND categories.published = 1 
            AND ( content.publish_up = '.$db->Quote($nullDate).'
               OR content.publish_up <= '.$db->Quote($now).' )
               AND ( content.publish_down = '.$db->Quote($nullDate).'
               OR content.publish_down >= '.$db->Quote($now).' )
            AND ( '.$sql_where.' )
            '.$frontpage_con.'
         ORDER BY
            '.$order_options.'
         LIMIT
            '.$config['startposition'].','.($amount + (int)$config['startposition']).';
         ';


 



         // run SQL query
         $db->setQuery($query_news);
         // when exist some results
         if($news = $db->loadObjectList())
         {
            // generating tables of news data
            foreach($news as $item)
            {
               $content_id[] = $item->ID; // news IDs
               $content_iid[] = $item->IID; // news IDs
               $content_cid[] = $item->CID; // news CIDs
               $content_title[] = $item->title; // news titles
               $content_text[] = $item->text; // news text
               $content_images[] = $item->images; // news images   
               $content_date[] = $item->date; // news dates
               $content_date_publish[] = $item->date_publish; // news dates
               $content_author[] = $item->author; // news author
               $content_catname[] = $item->cat; // news category name
               $content_sid[] = $item->SID; // news category section ID
               $news_amount++;   // news amount
            }
         }
      }
      //
      // Returning data in hash table
      //
      return array(
         "ID" => $content_id,
         "IID" => $content_iid,
         "CID" => $content_cid,
         "title" => $content_title,
         "text" => $content_text,
         "images" => $content_images,
         "date" => $content_date,
         "date_publish" => $content_date_publish,
         "author" => $content_author,
         "catname" => $content_catname,
         "SID" => $content_sid,
         "news_amount" => $news_amount
      );
   }
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #8 : 30.01.2010, 18:38:59 »
или  готов заплатить человеку 500р ,чтобы он сделал за меня
ася 5925920
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
*

rubasket

  • Захожу иногда
  • 346
  • 13 / 1
  • RuBasket.com
Re: Кэширование вручную
« Ответ #9 : 30.01.2010, 20:41:32 »
$db =& JFactory::getDBO();
  // getting instance of GK_JoomlaNews
  $newsClass = new GK_JoomlaNewsNP11();
  // Getting list of categories
  $categories = $newsClass->getSources($this->config, 0);
вот как было
$categories - эта переменная равна
$newsClass->getSources($this->config, 0);


тут понятно как все это обращаеться
а вот как стало
по инструкции
$db =& JFactory::getDBO();
  // getting instance of GK_JoomlaNews
  $cache = & JFactory::getCache();
  $cache->setCaching(1);
  $newsClass=$cache->call(array('GK_JoomlaNewsNP11','getSources'));
  // Getting list of categories
  $categories = $newsClass->getSources($this->config, 0);
а по-другому-то как?
Только я знаю,что могу (C) Джон Локк 
Why him ?Mmm? What  about me? БЕНЖАМИН Л
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Кэширование Joomla. Посоветуйте

Автор Shelby

Ответов: 15
Просмотров: 4332
Последний ответ 01.04.2015, 05:13:17
от 04r12
Нужно ли включать кэширование?

Автор MaJIb4iK

Ответов: 11
Просмотров: 5337
Последний ответ 09.12.2014, 10:41:00
от Kaktus_0,7
Кэширование и GZIP-сжатие страниц?

Автор 7Azimuth

Ответов: 7
Просмотров: 8173
Последний ответ 22.02.2014, 11:00:56
от Vavil[ON]
rel="shadowbox" пишу вручную, автоматизация

Автор Hufflepuff

Ответов: 1
Просмотров: 1636
Последний ответ 28.01.2014, 12:57:41
от flyingspook
Странное кэширование алиасов ссылки. Проблема

Автор romashkin

Ответов: 2
Просмотров: 1702
Последний ответ 25.06.2012, 01:08:11
от romashkin