<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / PHP / Хабр]]></title>
    <link>https://habr.com/ru/hubs/php/posts/</link>
    <description><![CDATA[PHP – скриптовый язык общего назначения]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sun, 03 May 2026 02:19:19 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @VAGNAT — Проектирование и рефакторинг (+4) — 28.04.2026 10:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028926/</guid>
    <link>https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Паттерны проектирования еще актуальны?</strong></p><p>Вокруг все чаще говорят, что ИИ скоро будет писать код за нас. Логичный вопрос — нужны ли тогда паттерны? Зачем разбираться в паттернах GoF, если нейросеть и так сгенерирует рабочий код по описанию?</p><p>У меня ощущение обратное.</p><p>Я плотно вошел в разработку в 2019 году. Переходил из 1С в .NET. Книги по паттернам GoF у меня были, но долго лежали как «книга на полке». Казалось, они оторваны от повседневных задач. Теорию вроде понимал, но не видел, где это реально применяется.</p><p>Все поменялось, когда я стал использовать ИИ как инструмент для обучения. Просил давать задачи, искать проблемы в решениях, объяснять, почему в одном месте уместен Strategy, а в другом лучше Mediator. Через практику и обсуждение паттерны перестали быть абстракцией.</p><p>Чем проще генерировать код, тем важнее понимать его форму и границы. Иначе не ускоришь разработку, а ускоришь накопление технического долга.</p><p>Из этого и вырос мой pet-project <a href="http://gofinsights.com" rel="noopener noreferrer nofollow">gofinsights.com</a>. Я делаю его тренажером по паттернам проектирования. Не просто «прочитал и забыл», а через практику, сравнение решений и постепенное распознавание типовых архитектурных ходов.</p><p>Сейчас там есть интерактивный квиз, где можно проверить базу и не перепутать Factory Method с Abstract Factory. Дальше хочу развивать проект в сторону более глубокого ИИ-разбора. Чтобы можно было не только узнавать паттерн, но и разбирать кодовые запахи, причины проблем и возможную эволюцию решений.</p><p>Как вы это видите? Паттерны проектирования все еще рабочая база для разработчика? Или с появлением ИИ они станут менее важны?</p> <a href="https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 07:43:49 GMT</pubDate>
    <dc:creator><![CDATA[VAGNAT]]></dc:creator>
      
      <category><![CDATA[паттерны проектирования]]></category><category><![CDATA[паттерны программирования]]></category><category><![CDATA[шаблоны]]></category><category><![CDATA[тренажёр]]></category><category><![CDATA[java]]></category><category><![CDATA[python]]></category><category><![CDATA[csharp]]></category><category><![CDATA[php]]></category><category><![CDATA[go]]></category><category><![CDATA[шаблоны проектирования]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PechoraDev — PHP (+2) — 26.04.2026 22:32]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028250/</guid>
    <link>https://habr.com/ru/posts/1028250/?utm_campaign=1028250&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>BloggyCms v1.0.0-rc.4</strong></p><p>Наконец-то спустя почти год и два месяца моя CMS-ка для ведения блога получила более менее внятный релиз-кандидат, в котором ошибок осталось не так много, и в принципе система уже легко ставится на хостинг и управляется. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/117/0bb/0ed/1170bb0ed00762e69fb1686986fa07af.png" alt="Дашборд системы" title="Дашборд системы" width="1025" height="785"><div><figcaption>Дашборд системы</figcaption></div></figure><p>Впереди - куча оптимизации, например вынесение всех форм шаблона админки в контроллеры, и последующий их рендеринг через render_form(). Данные контроллеров в json и так далее. </p><p>Но - текущая версия движка с последующими обновлениями уже не сломается, как это было в первых релизных версиях. </p><p>Ну и самое главное - официальный сайт. Как оказалось - это одна из тех задач, которая весьма объемна и кропотлива - это и документация, и каталог дополнений с API для разработчиков и еще много-много чего. </p><p>Приглашаю к тестированию: <a href="https://github.com/pechoradev/BloggyCms" rel="noopener noreferrer nofollow">https://github.com/pechoradev/BloggyCms</a></p><p>Также буду рад видеть новых контрибьюторов CMS. </p> <a href="https://habr.com/ru/posts/1028250/?utm_campaign=1028250&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 26 Apr 2026 19:32:08 GMT</pubDate>
    <dc:creator><![CDATA[PechoraDev]]></dc:creator>
      
      <category><![CDATA[php]]></category><category><![CDATA[cms]]></category><category><![CDATA[bloggycms]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PechoraDev — PHP (+2) — 22.04.2026 20:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1026750/</guid>
    <link>https://habr.com/ru/posts/1026750/?utm_campaign=1026750&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Мультиязычность. Ад для разработчика. </strong></p><p>Сейчас для моего движка понадобилась мультиязычность. Ну как понадобилась - на гитхабе прозрачно намекнули, что негоже одной гордой cms для ведения блога быть сугубо на русском языке. </p><p><strong>И понеслась...</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e8e/f02/615/e8ef026154f5ed0bc2318694b326f0b5.png" alt="Процесс перевода движка" title="Процесс перевода движка" width="1920" height="943"><div><figcaption>Процесс перевода движка</figcaption></div></figure><p>Это хорошо, что сейчас есть нейросети и они здорово упрощают процесс перевода. Но - по старинке все делаю вручную, каждый файл...Сначала размечаю обыкновенными дефайнами либо класс контроллера, либо шаблона, ну а потом выношу это все в соответствующие языковые папки. </p><p>Вайбкодеры меня наверняка закидали бы тапками, мол - все можно автоматизировать и перевести хоть тонну файлов за 20 минут. Но - мне это не в кайф =) </p><p>Кто хочет помочь в процессе перевода, а заодно и движок потестить - милости прошу: <a href="https://github.com/pechoradev/BloggyCms" rel="noopener noreferrer nofollow">https://github.com/pechoradev/BloggyCms</a></p> <a href="https://habr.com/ru/posts/1026750/?utm_campaign=1026750&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 22 Apr 2026 17:43:04 GMT</pubDate>
    <dc:creator><![CDATA[PechoraDev]]></dc:creator>
      
      <category><![CDATA[cms]]></category><category><![CDATA[мультиязычность]]></category><category><![CDATA[перевод]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @anagamin — PHP (+2) — 18.04.2026 20:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1025072/</guid>
    <link>https://habr.com/ru/posts/1025072/?utm_campaign=1025072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Господа фрилансеры!</p><p>20 лет я жил фрилансом. Искал заказы на fl.ru, договаривался на почасовую оплату, и спокойно работал в своем темпе. Поднимал сложные проекты, немного тимлидил, рос в навыках и т.п. Казалось, так будет всегда. Начинал я с PHP 3, каши из кода, вперемешку с html. Потом писал самопальные фреймворки, ускоряющие разработку. Со временем код становился чище, я освоил yii, yii2, Laravel втянулся в solid, научился в high load и т.п </p><p>Работа никогда не была моим средством самореализации. Это просто некая "дань этому миру", чтобы обслуживать тело. Я переехал в небольшой домик у озера в лесу, разбил огород, завёл хозяйство, тренировался по 4 часа в день, а работе уделял вечера.</p><p>Так вышло, что последние 7 лет я полностью перешел на постоянных заказчиков. Просто раз в пару месяцев выставлял им счет, исходя из 1000-1500р в час потраченного времени - всех все устраивало, мне платили без лишних вопросов, доверяли на слово. Но ничто не вечно в этом мире - старые проекты себя исчерпали, и пора искать новую работу. И тут я обнаружил, что старый подход больше не работает. Fl почти умер, заказов не найти. На hh - по 500-1000 откликов к каждой вакансии. Да и не хочу я работать с 9 до 18.</p><p> Появились какие-то новые биржи, основанные на попроектной оплате (типа, вставить виджет за 1к рублей). Но так полную занятость, обеспечивающую ежемесячный доход хотя бы в 150к, не найти. Ведь на поиск заказа,  обсуждение деталей, получение доступов, вкуривание в новый код и т.п. уходит целый день, и, получается, что фактическая стоимость часа - 100-200р в час. А разработку сложных проектов не оценить сразу - в процессе всегда задачи разрастаются в несколько раз.</p><p>Что делать? Как в нынешних реалиях найти работу простому кодеру, привыкшему к свободному графику и обладающему огромным "жизненным опытом"?) Чтобы просто можно было заполнить весь рабочий месяц, работать по 4-6 часов в день, без беготни по задачкам на 1-2к рублей.</p><p>P.S. в качестве пруфа, что история не выдуманная, ссылка на профиль https://www.fl.ru/users/namo/portfolio/</p> <a href="https://habr.com/ru/posts/1025072/?utm_campaign=1025072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 18 Apr 2026 17:06:02 GMT</pubDate>
    <dc:creator><![CDATA[anagamin]]></dc:creator>
      
      <category><![CDATA[фриланс]]></category><category><![CDATA[freelance]]></category><category><![CDATA[работа]]></category><category><![CDATA[работа в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @samako — PHP (+1) — 11.04.2026 19:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1022340/</guid>
    <link>https://habr.com/ru/posts/1022340/?utm_campaign=1022340&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Логистическая регрессия на MNIST (0 vs 1) на PHP: простой пример</strong><br><br>Если вам хочется не просто читать про машинное обучение, а попробовать сами – вот хороший учебный кейс.</p><p>Разбираем классическую задачу: бинарная классификация цифр (0 vs 1) на датасете MNIST (12 666 обучающих и 2 116 тестовых примеров) с помощью логистической регрессии, обученной через gradient descent. Всего 5 эпох – но результат всё равно шокирующе высокий. :)</p><p>Что тут интересного:</p><ul><li><p>можно наглядно посмотреть, как модель работает с изображениями (в виде векторов) </p></li><li><p>становится понятно, где линейные модели начинают "ломаться"</p></li><li><p>можно посмотреть код чистой реализации на PHP и самому покопаться в коде<br>– точность: 99.91%</p></li><li><p>и сравнить с более практичным вариантом на RubixML<br>– точность: 99.95%</p></li></ul><p>Это хороший переход от теории к практике: без заумных вещей, с понятной математикой и кодом.</p><p>Разбор:<br><a href="https://apphp.gitbook.io/ai-for-php-developers/chast-iii.-klassifikaciya-i-veroyatnosti/logisticheskaya-regressiya/prakticheskie-keisy/mnist-binarnaya-klassifikaciya-otlichaem-0-ot-1" rel="noopener noreferrer nofollow">https://apphp.gitbook.io/ai-for-php-developers/chast-iii.-klassifikaciya-i-veroyatnosti/logisticheskaya-regressiya/prakticheskie-keisy/mnist-binarnaya-klassifikaciya-otlichaem-0-ot-1</a><br><br>Примеры:<br><a href="https://aiwithphp.org/books/ai-for-php-developers/examples/part-3/logistic-regression/case-0/mnist-0-1" rel="noopener noreferrer nofollow">https://aiwithphp.org/books/ai-for-php-developers/examples/part-3/logistic-regression/case-0/mnist-0-1</a></p> <a href="https://habr.com/ru/posts/1022340/?utm_campaign=1022340&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 11 Apr 2026 16:21:11 GMT</pubDate>
    <dc:creator><![CDATA[samako]]></dc:creator>
      
      <category><![CDATA[php]]></category><category><![CDATA[machinelearning]]></category><category><![CDATA[machine-learning]]></category><category><![CDATA[machine learning]]></category><category><![CDATA[логистическая регрессия]]></category><category><![CDATA[MNIST]]></category><category><![CDATA[классификация изображений]]></category><category><![CDATA[RubixML]]></category><category><![CDATA[бинарная классификация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @GarageEight — Блог компании Garage Eight (+2) — 30.03.2026 12:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/garage8/posts/1016808/</guid>
    <link>https://habr.com/ru/companies/garage8/posts/1016808/?utm_campaign=1016808&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Три доклада с Backend-митапа Garage Eight</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/52d/0df/94e/52d0df94e8e65735fa60018dc1ad081c.png" width="1280" height="720"></figure><p><strong><em>&gt; AI в travel tech — но не ради хайпа</em></strong><br>Спикер: Глазунов Илья, backend lead в сервисе бронирования «ЖилиБыли»<br><a href="https://youtu.be/mjL_DRSoc_Q" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://vk.com/video-212530316_456239259" rel="noopener noreferrer nofollow">VK Видео</a></p><p><strong><em>&gt; Собрать LLM-стек для PHP за один вечер и не выстрелить себе в ногу</em></strong><br>Спикер: Якимов Андрей, backend-разработчик Garage Eight<br><a href="https://youtu.be/IAL6hDPU0yA" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://vk.com/video-212530316_456239271" rel="noopener noreferrer nofollow">VK Видео</a></p><p><strong><em>&gt; Модульная архитектура против хаоса: как ограничить контексты в большом монолите</em></strong><br>Спикер: Русин Иван, старший разработчик группы модернизации платформы Flowwow<br><a href="https://youtu.be/wJABbCEGQVc" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://vk.com/video-212530316_456239261" rel="noopener noreferrer nofollow">VK Видео</a></p><p>Подписывайтесь на <a href="https://t.me/+UQlqs1-k9iE5MTBi" rel="noopener noreferrer nofollow">наш телеграм-канал</a>, чтобы первыми узнавать о новых мероприятиях. Новый митап пройдет уже в апреле! </p> <a href="https://habr.com/ru/posts/1016808/?utm_campaign=1016808&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 30 Mar 2026 09:12:26 GMT</pubDate>
    <dc:creator><![CDATA[GarageEight (Garage Eight)]]></dc:creator>
      
      <category><![CDATA[php]]></category><category><![CDATA[записи докладов]]></category><category><![CDATA[митап]]></category><category><![CDATA[бэкенд митап]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ceomt — PHP (+3) — 25.03.2026 08:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014594/</guid>
    <link>https://habr.com/ru/posts/1014594/?utm_campaign=1014594&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Выпустили бесплатный курс для PHP-разработчиков</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8e7/86d/2aa/8e786d2aa9b0c3b0cfc2ac4b61307939.png" alt="Пример одного из уроков курса" title="Пример одного из уроков курса" width="1280" height="720"><div><figcaption>Пример одного из уроков курса</figcaption></div></figure><p>Всем привет! Год назад рассказывал в <a href="https://habr.com/ru/articles/875194/" rel="noopener noreferrer nofollow">этой статье на Хабре</a> о том, как мы подготовили и записали курс на 30+ часов для наших PHP-разработчиков. В итоге у нас вышло 43 урока, разбитые на 5 направлений.</p><p>Сначала думали упаковать все это в коммерческий формат, но решили оставить все как есть и просто поделиться с сообществом. Надеюсь, что он принесет вам пользу.  </p><p><a href="https://mediaten.ru/education/backend" rel="noopener noreferrer nofollow">Курс охватывает PHP от базовых механизмов до архитектуры и тестирования</a>. В программе — устройство языка, работа с памятью и производительностью, принципы ООП и проектирования, а также взаимодействие с базами данных.</p><p>Отдельные блоки посвящены внутренностям PHP (zval, сборщик мусора, OPcache, асинхронность), архитектурным подходам (SOLID, DDD, паттерны, организация бизнес-логики) и работе с БД — от проектирования схем до оптимизации запросов и масштабирования.</p><p>В части тестирования рассматриваются TDD, структура тестов и подходы к оценке их качества.</p><p>Материал основан на практических кейсах и разбирает задачи, которые встречаются в реальных проектах.</p><p>  </p> <a href="https://habr.com/ru/posts/1014594/?utm_campaign=1014594&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Mar 2026 05:39:11 GMT</pubDate>
    <dc:creator><![CDATA[ceomt]]></dc:creator>
      
      <category><![CDATA[php-программист]]></category><category><![CDATA[бесплатные курсы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 17.03.2026 08:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011098/</guid>
    <link>https://habr.com/ru/posts/1011098/?utm_campaign=1011098&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>WT CDEK library v.1.3.0 - обновление PHP SDK для Joomla + CDEK.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1c7/764/fee/1c7764fee34e3292ba69e3c18366cac8.png" width="1048" height="857"></figure><p>Небольшая нативная PHP Joomla библиотека для работы с API v.2 службы доставки CDEK. Библиотека представляет собой клиент для авторизации в CDEK API по OAuth, работы с некоторыми методами API: получения ряда данных и расчета стоимости доставки. Поддерживается Joomla 4.2.7 и выше.</p><p>В пакет входят:</p><ul><li><p>библиотека Webtolk/Cdekapi</p></li><li><p>системный плагин System&nbsp;— WT Cdek для&nbsp;хранения настроек и AJAX‑интеграций</p></li><li><p>task‑плагин Task&nbsp;— Update WT Cdek data для&nbsp;обновления локальных копий справочников CDEK по&nbsp;расписанию</p></li><li><p>web asset с&nbsp;официальным JavaScript‑виджетом СДЭК</p></li></ul><p><strong>👉 v.1.3.0. Что нового?</strong></p><ul><li><p>Полный рефакторинг библиотеки. Библиотека переработана в&nbsp;entity‑based API с&nbsp;фасадом Cdek и отдельным слоем запросов. Обратная совместимость не&nbsp;нарушена, поэтому версия библиотеки&nbsp;— 1.3.0.</p></li><li><p>Добавлена поддержка новых разделов API СДЭК. Добавлена поддержка новых разделов API СДЭК: webhooks, prealert, печатные формы, payment, passport, reverse, intakes и других сущностей.</p></li><li><p>Улучшена интеграция с&nbsp;Joomla. Улучшена интеграция с&nbsp;Joomla: installer script для&nbsp;layouts, новые поля Joomla Form для&nbsp;тарифов и обновлённые js виджета CDEK.</p></li><li><p>документация библиотеки. Все методы библиотеки подробно описаны, а&nbsp;так&nbsp;же текст документации собран в&nbsp;отдельной папке в&nbsp;git репозитории.</p></li></ul><p>Пример запроса&nbsp;— запрос информации о&nbsp;городе.</p><pre><code class="php">&lt;?php

use Webtolk\Cdekapi\Cdek;

\defined('_JEXEC') or die;

// Вариант 1: брать credentials из настроек плагина
$cdek = new Cdek();

// Вариант 2: передать credentials явно
$cdek = new Cdek(test_mode: true, client_id: 'your_client_id', client_secret: 'your_client_secret');

$result = $cdek-&gt;location()-&gt;getCities([
    'postal_code' =&gt; '410012',
    'city'        =&gt; 'Саратов',
    'size'        =&gt; 1,
]);
</code></pre><p>Результат запроса:</p><pre><code>Array
(
    [0] =&gt; Array
        (
            [code] =&gt; 428
            [city_uuid] =&gt; 7e54a0b3-76f0-41e2-92e0-f1e600ad84fd
            [city] =&gt; Саратов
            [fias_guid] =&gt; bf465fda-7834-47d5-986b-ccdb584a85a6
            [country_code] =&gt; RU
            [country] =&gt; Россия
            [region] =&gt; Саратовская область
            [region_code] =&gt; 47
            [fias_region_guid] =&gt; df594e0e-a935-4664-9d26-0bae13f904fe
            [sub_region] =&gt; городской округ Саратов
            [longitude] =&gt; 46.034266
            [latitude] =&gt; 51.533562
            [time_zone] =&gt; Europe/Saratov
            [payment_limit] =&gt; -1
        )

)</code></pre><p>Библиотека эта нужна для разработчиков, создающих свои расширения для интеграции Joomla и курьерской службы CDEK.</p><p><a href="https://web-tolk.ru/dev/biblioteki/wt-cdek-library-for-joomla-developers" rel="noopener noreferrer nofollow">Страница расширения</a></p><p><a href="https://github.com/WebTolk/WT-CDEK-Joomla-PHP-library" rel="noopener noreferrer nofollow">GitHub расширения</a> </p> <a href="https://habr.com/ru/posts/1011098/?utm_campaign=1011098&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Mar 2026 05:20:35 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[cdek]]></category><category><![CDATA[php sdk]]></category><category><![CDATA[php]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 25.02.2026 13:46]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1003492/</guid>
    <link>https://habr.com/ru/posts/1003492/?utm_campaign=1003492&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Особенность Joomla: json-значения для пользовательских полей и их рендер в subform и вне дочерней формы.</strong></p><p>Опять длинное название, но куда уж без этого...</p><p>Итак,  если вы делаете плагин пользовательского поля - его можно использовать через FieldsHelper. И в процессе ваши данные проходят через различные этапы обработки (недавно <a href="https://habr.com/ru/articles/1000064/" rel="noopener noreferrer nofollow">была статья на эту тему</a>). И может так оказаться, что ваше поле хранит в <code>rawvalue</code> json (и в базе данных соответственно тоже), а в <code>value</code> вы на его основе рендерите значение. Это стандартный подход Joomla. Так работают,  например, поля <code>accessiblemedia</code>.  Однако, если вы поместили ваше поле в дочернюю форму (пользовательское поле типа <code>subform</code> и включили <strong>"Рендеринг значений = Да"</strong>, то у вашего замечательного поля может появиться поломанный Json в <code>value</code> вместо нормального значения.</p><p><strong>Например:</strong></p><pre><code class="json">{&amp;quot;basePath&amp;quot;:&amp;quot;...&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;...&amp;quot;}</code></pre><p><strong>❓ Что там под капотом Joomla происходит?</strong></p><ol><li><p>В обычном потоке Joomla сначала вызывает событие <code>onCustomFieldsBeforePrepareField</code>, а потом <code>onCustomFieldsPrepareField</code>.</p></li><li><p>Внутри <code>subform</code> же  для подполей при <code>render_values=1</code> вызывается только событие - <code>onCustomFieldsPrepareField</code>.</p></li><li><p>Если преобразование значения (например, <code>json_decode</code>) сделано в вашем плагине только в <code>beforePrepareField</code>, оно не обработает данные  для подполя и...</p></li><li><p>В шаблоне поля строка заэкранируется (<code>htmlentities</code>), кавычки превратятся <s>в тыкву</s> в <code>&amp;quot;</code> и вы получите кривой json, вместо вашего значения.</p></li></ol><p><strong>👉 Собственно полезный совет по Joomla:</strong></p><p>Для полей, которые могут жить внутри <code>subform</code>, делайте нормализацию значения и в <code>onCustomFieldsPrepareField</code> тоже, не только в <code>beforePrepareField</code>.</p> <a href="https://habr.com/ru/posts/1003492/?utm_campaign=1003492&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Feb 2026 10:46:01 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla form]]></category><category><![CDATA[joomla form field]]></category><category><![CDATA[joomla fieldshelper]]></category><category><![CDATA[поля]]></category><category><![CDATA[баги]]></category><category><![CDATA[ошибки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 11.02.2026 23:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/995568/</guid>
    <link>https://habr.com/ru/posts/995568/?utm_campaign=995568&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Спустя почти год работы мой PR приняли в ядро Joomla!</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/97d/468/c4f/97d468c4f8357a3e7d6fc3c98cb85768.jpg" width="1013" height="1351"></figure><p>[<em>Тут должна быть победная пляска</em>] Год назад у моих клиентов возникла необходимость во вставке видео в кастомные поля материалов в раздел портфолио. Я начал делать и увидел, что именно стандартное пользовательское поле Media не умеет вставлять в поле ничего, кроме изображений, хотя поле Joomla Form <code>MediaField </code> умеет выбирать и документы (pdf и иже), аудио, видео и даже папки. Я начал работу над тем, чтобы добавить этот функционал&nbsp; в ядро и очень надеялся успеть к Joomla 5.3, которая выходила в апреле. В целом все сделал, сделал PR 25 февраля 2025 года, но PR не приняли, сказав, что это шибко новый функционал и ему будет хорошо в Joomla 6.0.0. Клиентам пришлось использовать&nbsp; медиа-менеджер от JCE, а PR отправился ждать релиза 6.0.0, который выходил осенью. К слову сказать, эта пауза была полезна для него, так как летом, уже неспешно я получал советы по улучшению и в июле всё точно было готово.</p><p>Релизный цикл Joomla состоит из нескольких этапов: сначала выходят alpha-версии (до 3х штук), где просто фиксируются накопленные изменения, потом beta, где наступает feature freeze - заморозка новых функций, их нельзя уже добавлять. Дальше только отладка и правки&nbsp; существующих новшеств. У каждого релиза есть 2 релиз-менеджера.</p><p>В работе над PR мне помогал все это время Брайан Тиман - ко-фаундер Joomla. К концу июля все было готово, проверено, PR имел 2 необходимых независимых теста. Ждём беты. </p><p>Дата беты приходилась на понедельник. Где-то в пятницу днём я отписался в PR и получил совет написать релиз+менеджерам. Как-то удалось найти их в Mattermost, где обитает международное сообщество, но пятница и выходные, а все ж волонтеры и не на зарплате... Моё сообщение прочитали после релиза беты... Сказали, что не были в курсе моего PR (ожидаемо, их около 200-250 все время открытых). И сказали, что поезд ушёл, хоть и so sorry. Зато будет хорошо увидеть PR на тестах в Pizza, Bugz and Fun и вообще welcome в 6.1. </p><p>После выхода 6.0.0 меняются релиз-менеджеры. Мы списались: да, все хорошо, но нужно кое-что подправить. Тут конец года и закрытие дедлайнов, потом Новый год и весь январь никто толком не работает. Beta для 6.1 выходит 17 февраля. Последняя alpha&nbsp; недели за 3 до этого.</p><p>Незадолго до выхода альфы я-таки получаю сообщение, что реализуемый функционал сделан не по "Joomla way" и если код в ядре, то этот код является учебным пособием по тому, как ядро использовать. Резонно. А ещё у релиз-менеджера есть собственные наработки и экспертиза в этой теме и свой медиа-менеджер, в котором он тоже прошел огонь, воду и медные трубы. Согласно Joomla way мне нужно было разделить одно мега-крутое поле на 4 отдельных (картинки, аудио, видео и документы). Я подумал, что требуется сделать 4 плагина вместо одного и сказал, что не успею. Мне ответили, что beta is more important for us и время ещё есть, что мне подскажут и 4 плагина делать не нужно. </p><p>Пока суть да дело - время идёт. У меня тоже работа, трое детей, карантины, уроки... Но добить этот PR уже стало делом принципа. Я&nbsp; нашел как нужно было делать, принял несколько правок и пожеланий, потом фиксы code style. Сегодня с утра был последний коммит. Сегодня вечером, 11 февраля 2026 года, PR наконец-то смержен в ядро Joomla.</p><p>Эта работа научила меня очень многому. 170 комментариев в conversation на GitHub, несколько отдельных переписок, 1 год на разработку и внедрение простой в целом фичи, "звоночек" в голове: "не забыть, успеть, сделать, найти"... </p><p>Сегодня я поднимаю кружку пенного за этот небольшой&nbsp; в целом PR, за этот прошедший год, за Joomla и за Open Source.</p><p><a href="https://github.com/joomla/joomla-cms/pull/45013" rel="noopener noreferrer nofollow">https://github.com/joomla/joomla-cms/pull/45013</a></p><p>#joomla #cms #opensource #community #webdev</p><p>P.S. Фото с пивом сюда выставлять не буду, но представьте, что оно тут есть.</p> <a href="https://habr.com/ru/posts/995568/?utm_campaign=995568&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 11 Feb 2026 20:07:56 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[Joomla]]></category><category><![CDATA[community]]></category><category><![CDATA[github]]></category><category><![CDATA[open source]]></category><category><![CDATA[жизнь]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @samako — PHP (+2) — 01.02.2026 00:23]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991390/</guid>
    <link>https://habr.com/ru/posts/991390/?utm_campaign=991390&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>PHP и Machine Learning: собрать всё в одном месте<br></strong><br>Когда речь заходит о машинном обучении в контексте PHP, обсуждение почти всегда сводится к одному и тому же: либо тема считается неактуальной, либо в качестве источников всплывают устаревшие материалы и разрозненные эксперименты.</p><p>При этом реальные библиотеки, инструменты и проекты реально существуют – просто они сильно разбросаны и редко попадают в поле зрения.</p><p>Поэтому я собрал их в одном месте:</p><p>👉 <a href="https://github.com/apphp/awesome-php-ml" rel="noopener noreferrer nofollow">https://github.com/apphp/awesome-php-ml</a></p><p>Это список, обновляемый в ручном режиме, в который входят:</p><ul><li><p>библиотеки для machine learning и AI на PHP</p></li><li><p>инструменты для математики, статистики и обработки данных</p></li><li><p>примеры проектов</p></li><li><p>статьи и обучающие материалы</p></li><li><p>и ещё много чего</p></li></ul><p>Цель не в том, чтобы "сделать из PHP …" (ну, вы понимаете, да? 😄), а в том, чтобы упростить обзор того, что уже возможно, и избавить разработчиков от бесконечного поиска по GitHub и устаревшим постам.</p><p>Репозиторий пока на ранней стадии и точно не полный – PR'ы, поддержка звёздочкой и  любые идеи приветствуются!</p> <a href="https://habr.com/ru/posts/991390/?utm_campaign=991390&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 31 Jan 2026 21:23:15 GMT</pubDate>
    <dc:creator><![CDATA[samako]]></dc:creator>
      
      <category><![CDATA[php]]></category><category><![CDATA[machinelearning]]></category><category><![CDATA[ai]]></category><category><![CDATA[awesome]]></category><category><![CDATA[машинное обучениe]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 29.01.2026 08:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990436/</guid>
    <link>https://habr.com/ru/posts/990436/?utm_campaign=990436&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Событие Pizza, Bugs &amp; Fun  - 29-30  января 2026 года.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a40/1e9/8ae/a401e98ae67bfa1b04837bb53a38294a.png" width="1280" height="670"></figure><p>Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs &amp; Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.</p><p>Ссылки на видео и статьи из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF, а так же что и как делать. Координация международного сообщества Joomla происходит в Mattermost (<a href="https://docs.joomla.org/Mattermost" rel="noopener noreferrer nofollow">присоединиться</a>).</p><p>В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.</p><p>Каждый помогает тем, что он умеет:</p><ul><li><p>кто-то пишет недостающую документацию,</p></li><li><p>кто-то пишет код,</p></li><li><p>кто-то тестирует как исправлены ошибки или сделан новый функционал.</p></li></ul><p>На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.</p><p>На момент написания данного поста в репозитории Joomla 810 открытых Issue (как правило это баги) и 236 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.</p><p>Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀 И ничего не останется нашим коллегам из международных Joomla-чатов.</p><ul><li><p><a href="https://www.youtube.com/watch?v=a-FuVKXg_Uw" rel="noopener noreferrer nofollow">Смотреть видео</a></p></li><li><p><a href="https://www.pizza-bugs-fun.com/en/" rel="noopener noreferrer nofollow">Сайт события</a></p></li><li><p><a href="https://web-tolk.ru/blog/joomla-kak-testirovat-vsego-8-minut" rel="noopener noreferrer nofollow">Joomla: как тестировать? Всего 8 минут.</a></p></li><li><p><a href="https://habr.com/ru/posts/980678/" rel="noopener noreferrer nofollow">Как тестировать Joomla PHP-разработчику? Компонент Patch tester.</a>  (кстати, не только PHP разработчику)</p></li></ul><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскояызчного Joomla-сообщества</a></p> <a href="https://habr.com/ru/posts/990436/?utm_campaign=990436&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 29 Jan 2026 05:51:28 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[pbf]]></category><category><![CDATA[pizza bugs and fun]]></category><category><![CDATA[community]]></category><category><![CDATA[сообщество]]></category><category><![CDATA[тестирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vk15work — PHP — 14.01.2026 11:32]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/985070/</guid>
    <link>https://habr.com/ru/posts/985070/?utm_campaign=985070&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Функция <strong>date</strong> меняет поведение в PHP <strong>8.x</strong></p><p>При переносе Legacy-проекта с PHP 7.4 на 8.4 столкнулся с недокументированной проблемой изменения поведения функции <strong>date</strong> при передаче в качестве параметра <strong>timestamp</strong> значения <strong>NULL </strong>Один и тот же код даст разный результат:</p><pre><code class="php">echo date("Y-m-d H:i:s", null);

// PHP 7.4 и ниже 1970-01-01 00:00:00

// PHP 8.0 и выше 2026-01-14 08:11:56</code></pre><p>В примере <strong>NULL</strong> передается в явном виде, но в рабочем коде он вполне может прилетать из БД или других переменных, поэтому потенциальная ошибка может остаться незамеченной. Вообще, по принципам ООП, явное всегда лучше неявного, да и сам я сторонник использования <strong>\DateTime</strong>. В этом случае, результат кода:</p><pre><code class="php">$date = new \DateTime();
$date-&gt;setTimestamp(null);
echo $date-&gt;format("Y-m-d H:i:s");</code></pre><p>был бы одинаковый, а с версии 8.1 вы бы начали получать предупреждение</p><pre><code>Deprecated: DateTime::setTimestamp(): Passing null to parameter #1 ($timestamp) 
of type int is deprecated
1970-01-01 00:00:00</code></pre><p>Я бы рекомендовал перед миграцией версий PHP в Legacy-проектах либо учитывать эту особенность поведения функции <strong>date</strong> и убедиться, что <strong>NULL</strong> не приходит в параметр <strong>timestamp</strong>,<strong> </strong>либо сразу сделать рефакторинг на <strong>\DateTime</strong>, чтобы в принципе избежать таких проблем. </p> <a href="https://habr.com/ru/posts/985070/?utm_campaign=985070&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 14 Jan 2026 08:32:34 GMT</pubDate>
    <dc:creator><![CDATA[vk15work]]></dc:creator>
      
      <category><![CDATA[php]]></category><category><![CDATA[date]]></category><category><![CDATA[datetime]]></category><category><![CDATA[timestamp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 26.12.2025 08:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/980678/</guid>
    <link>https://habr.com/ru/posts/980678/?utm_campaign=980678&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как тестировать Joomla PHP-разработчику? Компонент Patch tester.</strong></p><p>Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать.</p><iframe id="694e22c51af3cf77e5703c83" src="https://embedd.srv.habr.com/iframe/694e22c51af3cf77e5703c83" class="embed_video embed__content" allowfullscreen="true"></iframe><p>На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla.</p><p>Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора.</p><p><a href="https://github.com/joomla-extensions/patchtester" rel="noopener noreferrer nofollow">Компонент на GitHub</a></p><p>Это видео также на:</p><ul><li><p><a href="https://www.youtube.com/watch?v=wIIV3RQxVBI" rel="noopener noreferrer nofollow">Видео на YouTube</a></p></li><li><p><a href="https://rutube.ru/video/fc3be7ceae76bb8ebf501d7ee9fc29a7/" rel="noopener noreferrer nofollow">Видео на RuTube</a></p></li></ul><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскоязычного Joomla-сообщества</a></p><p>#joomla #php #webdev #community</p> <a href="https://habr.com/ru/posts/980678/?utm_campaign=980678&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Dec 2025 05:53:41 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla patch tester]]></category><category><![CDATA[joomla test]]></category><category><![CDATA[joomla github]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[тестирование веб-приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 23.12.2025 14:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/979716/</guid>
    <link>https://habr.com/ru/posts/979716/?utm_campaign=979716&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>WT IndexNow плагин для Joomla - отправка страниц сайта на переиндексацию в поисковые системы.</strong></p><p>Пакет плагинов, обеспечивающий ручную и автоматическую отправку url адресов Joomla в поисковые системы на переиндексацию по протоколу IndexNow.</p><iframe id="694a77c9f90e6596c21f46f8" src="https://embedd.srv.habr.com/iframe/694a77c9f90e6596c21f46f8" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Согласно документации протокол поддерживают все крупнейшие поисковые системы, кроме Google. Протокол служит для получения от сайтов URL, которые нужно переиндексировать заново или проиндексировать в первый раз как можно быстрее. Отправка адресов сайта таким образом существенно ускорит индексацию нового или изменённого контента поисковыми системами.</p><p>Поисковые системы по этому протоколу обмениваются друг с другом данными, поэтому отправив URL в одну из них вы сообщаете их сразу всем.</p><p>Протокол IndexNow поддерживают:</p><ul><li><p>Amazon</p></li><li><p>Microsoft Bing</p></li><li><p>Naver</p></li><li><p>Seznam.cz</p></li><li><p>Yandex</p></li><li><p>Yep</p></li></ul><p>Суточный лимит URL - 10000 в сутки. Возможна отправка вручную и автоматически. Пакетом поддерживаются:</p><ul><li><p>материалы и категории материалов Joomla</p></li><li><p>контакты и категории контактов Joomla</p></li><li><p><a href="https://web-tolk.ru/dev/components/sw-jprojects" rel="noopener noreferrer nofollow">SW JProjects</a> - компонент каталога расширений для Joomla</p></li><li><p><a href="https://www.webdesigner-profi.de/joomla-webdesign/shop.html" rel="noopener noreferrer nofollow">JoomShopping</a> - компонент интернет-магазина для Joomla</p></li><li><p><a href="https://www.phoca.cz/phocadownload" rel="noopener noreferrer nofollow">Phoca Download</a> - компонент каталога файлоа для Joomla</p></li><li><p><a href="https://www.phoca.cz/phocacart" rel="noopener noreferrer nofollow">Phoca Cart</a> - компонент интернет-магазина для Joomla</p></li><li><p><a href="https://radicalmart.ru" rel="noopener noreferrer nofollow">RadicalMart</a> - компонент интернет-магазина для Joomla</p></li></ul><p>Разработчики могут по образу и подобию создать собственный плагин для поддержки необходимых компонентов.</p><p>Пакет плагинов работает с Joomla 4.3+. Тестировался на Joomla 5 и Joomla 6.</p><p>Ссылки:</p><p><a href="https://web-tolk.ru/dev/joomla-plugins/wt-indexnow" rel="noopener noreferrer nofollow">Страница расширения</a></p><p><a href="https://github.com/WebTolk/WT-Index-now-joomla-package" rel="noopener noreferrer nofollow">GitHub расширения</a></p><p><a href="https://yandex.ru/support/webmaster/ru/indexing-options/index-now" rel="noopener noreferrer nofollow">Раздел Поддержка протокола IndexNow в справке Яндекса</a></p><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскоязычного Joomla-сообщества</a></p> <a href="https://habr.com/ru/posts/979716/?utm_campaign=979716&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Dec 2025 11:11:08 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla 6]]></category><category><![CDATA[joomla seo]]></category><category><![CDATA[joomla index now]]></category><category><![CDATA[index now]]></category><category><![CDATA[поисковые системы]]></category><category><![CDATA[индексация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/977930/</guid>
    <link>https://habr.com/ru/posts/977930/?utm_campaign=977930&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Метод registerListeners() в CMSPlugin в плагинах  планируется удалить в Joomla 7.0.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/171/919/133/171919133952b924b129dfcda46946bc.png" width="578" height="559"></figure><p>Этот метод регистрирует устаревшие слушатели событий в диспетчере, имитируя работу плагинов Joomla! 3.x и ниже для Joomla 4+. По умолчанию этот метод ищет все общедоступные методы, название которых начинается с <code>on</code>. Он регистрирует лямбда-функции (замыкания), которые пытаются преобразовать аргументы отправленного события в аргументы вызова метода и вызвать ваш метод <code>on&lt;Нечто&gt;</code>. Результат передаётся обратно событию в его аргумент <code>result</code>.</p><p>Теперь этот слой совместимости с устаревшей Joomla 3 помечен к удалению в Joomla 7.0, которая должна выйти осенью 2027 года. Это означает, что те уникальные расширения от Joomla 2.5 / Joomla 3, которые ещё работали на Joomla 4-6 скорее всего окончательно перестанут работать на Joomla 7. Предполагается, что активные разработчики планомерно и постепенно избавляются от технического долга и обновляют свои расширения 😎</p><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскоязычного Joomla-сообщества</a>.</p> <a href="https://habr.com/ru/posts/977930/?utm_campaign=977930&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Dec 2025 06:17:00 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla 7]]></category><category><![CDATA[joomla plugin]]></category><category><![CDATA[joomla legacy]]></category><category><![CDATA[legacy]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 11.12.2025 12:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/975650/</guid>
    <link>https://habr.com/ru/posts/975650/?utm_campaign=975650&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Совет по Joomla: использовать выключенное состояние для кнопок в списках элементов админки - <code>listCheck()</code>.</strong></p><iframe id="693a8949eed6bbc4e84d751f" src="https://embedd.srv.habr.com/iframe/693a8949eed6bbc4e84d751f" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Мы добавляем в тулбар панели администратора Joomla некую кнопку, которая что-то делает со списком id выделенных элементов и ajax-запросом отсылаем их в свой плагин. Но нам надо предупредить нажатия на кнопку в тех случаях, когда ни один элемент не был выбран. Для этого можно написать свою проверку на js. А можно воспользоваться встроенной в Joomla.</p><p><strong>Добавить кнопку в тулбар Joomla 6.</strong></p><pre><code class="php">use Joomla\CMS\Toolbar\Button\BasicButton;
use Joomla\CMS\Language\Text;

// ниже по коду, где-нибудь в плагине на onAfterDispatch()
// Предварительно проверяем в каком компоненте мы находимся по option из $app-&gt;getInput()
// пример из плагина, поэтому $this-&gt;getApplication()
$app = $this-&gt;getApplication();
// Берём текущий тулбар
$toolbar = $app-&gt;getDocument()-&gt;getToolbar('toolbar');

// Создаём кнопку
$button = (new BasicButton('send-to-indexnow'))
    -&gt;text(Text::_('PLG_WTINDEXNOWSWJPROJECTS_BUTTON_LABEL'))
    -&gt;icon('fa-solid fa-arrow-up-right-dots')
    -&gt;onclick("window.wtindexnowswjprojects()");

// Добавляем кнопку в тулбар
$toolbar-&gt;appendButton($button);</code></pre><p><strong>Заблокировать кнопку тулбара Joomla, если не выбраны элементы списка.</strong></p><p>Теперь нам надо проверить находимся ли мы в списке. Делаем это по view из <code>$app-&gt;getInput()</code>.</p><pre><code class="php">if(in_array($app-&gt;getApplication()-&gt;getInput()-&gt;get('view'),
            ['categories','documentation','projects','versions'])
  ) {
        $button-&gt;listCheck(true);
}</code></pre><p>И если мы в списке - используем метод&nbsp;<code>$button-&gt;listCheck(true)</code>, который сделает проверку за нас. Если ни один элемент не выбран - кнопка в тулбаре Joomla будет заблокирована и JS-обработчик не будет вызван. Этот метод есть у всех классов кнопок, наследующих класс&nbsp;<code>\Joomla\CMS\Toolbar\ToolbarButton</code>. </p> <a href="https://habr.com/ru/posts/975650/?utm_campaign=975650&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Dec 2025 09:09:45 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla 6]]></category><category><![CDATA[joomla toolbar]]></category><category><![CDATA[toolbar button]]></category><category><![CDATA[joomla api]]></category><category><![CDATA[joomla php]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @php7 — Программирование (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/974178/</guid>
    <link>https://habr.com/ru/posts/974178/?utm_campaign=974178&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Этот финт сэкономит вам время и нервы</p><figure class=""><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/e0b/d54/bc3/e0bd54bc3f66018aaa0ca839dbd90000.png"></figure><p>Хочу написать о финте, который позволит вам сохранить нервы и сэкономить время. Правда некоторые (многие, почти все) впадают в ступор от него. Поэтому тут использована&nbsp;КДПВ&nbsp;с&nbsp;<a href="https://habr.com/ru/articles/894748/" rel="noopener noreferrer nofollow">поста</a>. Я наверно чувак слева.</p><p>А именно добавление&nbsp;первым условием if единицы:</p><pre><code class="php">if (1
&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Использование финта дает нам возможность:<br>1. Быстро выключать фичу заменой 1 на 0:</p><pre><code class="php">if (0
&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>2. Быстро выключать любое условие в PhpStorm через горячие клавиши:</p><pre><code class="php">if (1
//&nbsp; &nbsp; &amp;&amp; $cond1
&nbsp; &nbsp; &amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Без этого финта&nbsp;мы не можем быстро выключить первое условие.<br>Нам приходится делать&nbsp;примерно такую фигню, манипулируя&nbsp;с двумя строками и целясь в &amp;&amp;:</p><pre><code class="bash">if (
&nbsp; &nbsp;&nbsp;/*$cond1
&nbsp; &nbsp; &amp;&amp;*/ $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>Или такую:</p><pre><code class="bash">if (
&nbsp; &nbsp;&nbsp;$cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>3. Быстро добавлять новое первое условие:</p><pre><code class="bash">if (1
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>легко превращается в:</p><pre><code class="php">if (1
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond1 // в изменениях одна строка
&nbsp; &nbsp;&nbsp;&amp;&amp; $cond2
&nbsp; &nbsp; &amp;&amp; $cond3
)</code></pre><p>4. Быстро дублировать любое условие.</p><p>5. Быстро менять порядок условий.</p><p>6. Также у нас будет чистый diff git-а при удалении/добавление первого условия.<br>Тут должен быть рисунок удаления с финтом и без, рисунок добавления с финтом и без.<br>Также при конфликте у нас будет более простое его решение, если нужно просто добавить оба условия.</p><p>Данный финт сродни правилу хорошего тона добавлять после последнего элемента массива запятую.<br>Это дает нам возможность при добавлении работать только с одной строкой. Добавлять горячими&nbsp;клавишами дублирования строк, в diff опять же будет только 1 строка, а также при конфликте&nbsp;слияний просто применяем обе строки и не нужно проставлять запятые, а то код упадет.</p> <a href="https://habr.com/ru/posts/974178/?utm_campaign=974178&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 07 Dec 2025 12:34:02 GMT</pubDate>
    <dc:creator><![CDATA[php7]]></dc:creator>
      
      <category><![CDATA[нервы]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[чистый код]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 29.11.2025 11:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/971498/</guid>
    <link>https://habr.com/ru/posts/971498/?utm_campaign=971498&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>[ВИДЕО] AmoCRM + Joomla: быстрая настройка интеграции. Библиотека WT AmoCRM.</strong></p><blockquote><p>- Как быстро настроить интеграцию AmoCRM и сайта на Joomla? </p><p>- использовать PHP библиотеку WT AmoCRM для Joomla, которая предполагает использование её разработчиками. А разработчики могут написать любое количество плагинов и решений по интеграции и автоматизации AmoCRM и Joomla.</p></blockquote><p>Смотреть видео на:</p><ul><li><p><a href="https://www.youtube.com/watch?v=mGPgbpgJHt8" rel="noopener noreferrer nofollow">Youtube</a></p></li><li><p><a href="https://rutube.ru/video/6f7e3a0ee5ccf47f7e61a11373194a18/" rel="noopener noreferrer nofollow">Rutube</a></p></li><li><p><a href="https://vkvideo.ru/video-230331145_456239026" rel="noopener noreferrer nofollow">VK Видео</a></p></li></ul><p><strong>Содержание:</strong></p><ul><li><p>00:15 - что такое эта библиотека и как она работает? Тех.ликбез.</p></li><li><p>03:00 - установка с сайта или с GitHub</p></li><li><p>04:00 - собственно установка и настройка интеграции.</p></li><li><p>05:10 - создание внешней интеграции в интерфейсе AmoCRM</p></li><li><p>08:05 - что-то пошло не так... Почему и как исправить (случай с пересозданием интеграции)</p></li><li><p>08:48 - успешное подключение к AmoCRM</p></li><li><p>11:11 - как понять что всё работает?</p></li><li><p>11:50 - демонстрация работы: отправка заказа из компонента интернет-магазина RadicalMart в AmoCRM</p></li><li><p>14:20 - потенциальные возможности по автоматизации бизнес-процессов в связке Joomla с AmoCRM</p></li></ul><p><a href="https://web-tolk.ru/dev/biblioteki/wt-amo-crm-library" rel="noopener noreferrer nofollow">Страница расширения</a></p><p><a href="https://github.com/WebTolk/WT-Amo-CRM-library-for-Joomla-4" rel="noopener noreferrer nofollow">Скачать с GitHub</a></p><p>Есть ряд готовых решений для интеграции:</p><ul><li><p><a href="https://web-tolk.ru/dev/joomla-plugins/wt-amocrm-joomshopping" rel="noopener noreferrer nofollow">JoomShopping  - Joomla компонент интернет-магазина</a></p></li><li><p><a href="https://web-tolk.ru/dev/joomla-plugins/wt-amocrm-radicalmart" rel="noopener noreferrer nofollow">RadicalMart  - Joomla компонент интернет-магазина</a></p></li><li><p><a href="https://web-tolk.ru/dev/joomla-plugins/wt-amocrm-radicalform" rel="noopener noreferrer nofollow">RadicalForm - Joomla плагин формы обратной связи</a></p></li></ul> <a href="https://habr.com/ru/posts/971498/?utm_campaign=971498&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 29 Nov 2025 08:27:57 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[amocrm]]></category><category><![CDATA[интеграция]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/967434/</guid>
    <link>https://habr.com/ru/posts/967434/?utm_campaign=967434&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Человек на GitHub ускорил Joomla в 600 раз на объёме 150к+ материалов в 1700+ категориях.</strong></p><p>На старте его сайт на Joomla 3 вообще не смог обновиться на Joomla 5. Пришлось делать экспорт/импорт материалов. Проделав всё это он запустил-таки этот объём данных на Joomla 5. Тестовый скрипт грузил 200 материалов из этого объёма всего за 94 секунды ))) А главная страница с категориями грузилась 20 секунд.</p><p>Добавив индекс для таблицы <code>#__content</code></p><pre><code class="sql">CREATE INDEX idx_catid_state ON #__content (catid, state);</code></pre><p>он сократил время загрузки категорий до 1 секунды. Затем наш герой решил поковырять SQL-запрос в <code>ArticleModel</code>, который отвечает за выборку материалов. И решил заменить тип JOIN на <code>STRAIGHT_JOIN</code> для категорий.</p><pre><code class="sql">// -&gt;from($db-&gt;quoteName('#__content', 'a'))
-&gt;from(
    $db-&gt;quoteName('#__content', 'a')
    . ' STRAIGHT_JOIN ' . $db-&gt;quoteName('#__categories', 'c')
    . ' ON ' . $db-&gt;quoteName('c.id') . ' = ' . $db-&gt;quoteName('a.catid')
)
// -&gt;join('LEFT', $db-&gt;quoteName('#__categories', 'c'), $db-&gt;quoteName('c.id') . ' = ' . $db-&gt;quoteName('a.catid'))</code></pre><p>Что сократило загрузку 200 материалов из 150к с 94 секунд до 5. К слову сказать, боевой сайт на Joomla 3 крутится на <strong>12CPU 64GB рамы</strong>. А все манипуляции с кодом он делает на базовом <strong>1CPU 1GB</strong> сервере и замеры скорости даны именно для базового сервера.</p><p>Но это всё в дискуссии, хотя в идеале  должно вылиться в Pull Requests. Дальнейшие его изыскания и результаты можно поглядеть в дискуссии на GitHub. Это ещё не конец.</p><p>Мы - Open Source сообщество, где никто никому ничего не должен. Джунгли. Но человек ищет пути оптимизации Joomla и предлагает решения. Если оказать поддержку и предложить помощь хотя бы с тестированием самых разнообразных сценариев, то возможно эти улучшения смогут войти в ядро. Пусть не быстро, пусть через несколько лет, пусть не все, но войдут. Достаточно  предложить руку помощи и приложить немного усилий.</p><p><a href="https://github.com/joomla/joomla-cms/discussions/45737" rel="noopener noreferrer nofollow">Дискуссию на GitHub можно почитать здесь</a>.</p> <a href="https://habr.com/ru/posts/967434/?utm_campaign=967434&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 18 Nov 2025 05:38:58 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[высокие нагрузки]]></category><category><![CDATA[производительность]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
