Новости Joomla

Вышли релизы Joomla 6.1 и Joomla 5.4.5: новые возможности и стабильность

Релиз Joomla 6.1.0

Проект Joomla! объявил о доступности Joomla 6.1 [Nyota] — новой минорной версии шестой серии, а также о выпуске релиза исправлений ошибок Joomla 5.4.5. Релиз 6.1 приносит ряд долгожданных функций, повышающих удобство управления контентом и защиту от спама.

👩‍💻 Компонент "CS Афиши" для Joomla.

👩‍💻 Компонент "CS Афиши" для Joomla.

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

В состав пакета расширений входят:
- Компонент "CS Афиши"
- Модуль "Календарь событий"
- Модуль "Предстоящие события"
- Библиотека "ImgResize"

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

Модуль "Календарь событий" отображает предстоящие и прошедшие мероприятие на календаре, с отображением мероприятий на конкретную дату во всплывающем окне.

Модуль "Предстоящие события" показывает список предстоящий событий по порядку их наступления.

P.S. Расширение платное, но плата символическая, чисто для отработки приема платежей. Ключи без ограничения по времени, купившие сейчас - смогут обновляться без ограничений.

Разработчик - участник нашего сообщества Дмитрий Денисов (@codersite).

Страница расширения
Демо

Яндекс выпустил инструмент Видимость сайта в Алисе AI.

Яндекс выпустил инструмент Видимость сайта в Алисе AI.

С тех пор, как в поисковиках появились нейроответы ИИ, трафик на сайты стал гораздо меньше, так как пользователь стал получать информацию непосредственно на странице поисковика без перехода на сайт. Но при генерации ответа ИИ указывает источники - ссылки на сайты, информация которых была использована для генерации ответа.

Долгое время у всех был немой вопрос: "Как же теперь оценивать эффективность сайта?". Теперь этот на этот вопрос отчасти отвечает новый инструмент аналитики.
Процитируем справку Яндекса по инструменту:
На запросы пользователей в Поиске может отвечать Алиса AI. Ответы появляются в поисковой выдаче, в объектных ответах и на отдельной вкладке Поиска. В них чаще всего упоминаются страницы сайтов, на которые Алиса AI опиралась при подготовке ответа.

С помощью инструмента Видимость сайта в Алисе AI в Яндекс Вебмастере вы можете:
- узнать долю упоминаний сайта среди источников в ответах Алисы AI в Поиске и отследить динамику изменений;
- посмотреть примеры запросов, по которым страницы сайта показываются в ответах Алисы AI;
- посмотреть примеры сайтов той же тематики, которые часто упоминаются в генеративной выдаче.
Данные отображаются за последние 3 месяца и обновляются каждую неделю.

Статистика собирается только по тем запросам, по которым ваш сайт уже находится достаточно высоко в поисковой выдаче. Это позволяет анализировать видимость именно в той нише, где вы заинтересованы в продвижении, и избегать «размытия» по малозначимым для вас запросам.

Кроме того, такой подход обусловлен работой Алисы AI: она строит ответ с опорой на самые релевантные, информативные и качественные страницы, которые обычно занимают высокие позиции в Поиске.

Чтобы увидеть статистику вашего сайта в меню Яндекс.Вебмастера перейдите в раздел "Эффективность" и далее в "Показы сайта в Алисе AI".

В начале февраля 2026г. был вебинар с Михаилом Сливинским - амбассадором Поиска Яндекса, и в рамках вебинара была озвучена просьба сделать такой инструмент. Скорее всего разработка на тот момент уже велась, потому что от просьбы до релиза прошло около 2-х месяцев. В любом случае хорошо, что такая статистика появилась.

Показы сайта в Алисе AI в вашем Яндекс,Вебмастере.

@joomlafeed

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

cartgen

  • Захожу иногда
  • 54
  • 8 / 2
1) Добавить столбец в базу SQL через PHP myADMin

ALTER TABLE `jos_users` ADD `registerIp` VARCHAR( 15 ) NOT NULL AFTER `gid` ;


*****************************************************************************
2)libraries/joomla/database/table/user.php

/**
    * The login name
    *
    * @var string
    */
   var $username      = null;



// -- Добавить код -->
   var $registerIp      = null;
//-- ************ -->



...

*****************************************************************************
3)Добавление скрытого поля в регистрацию

components/com_user/views/register/tmpl/default.php


...
<form action="<?php echo JRoute::_( 'index.php?option=com_user' ); ?>" method="post" id="josForm" name="josForm" class="form-validate">

<?php if ( $this->params->def( 'show_page_title', 1 ) ) : ?>
<div class="componentheading<?php echo $this->escape($this->params->get('pageclass_sfx')); ?>"><?php echo $this->escape($this->params->get('page_title')); ?></div>
<?php endif; ?>

<table cellpadding="0" cellspacing="0" border="0" width="100%" class="contentpane">
<tr>
   <td width="30%" height="40">
      <label id="namemsg" for="name">
         <?php echo JText::_( 'Name' ); ?>:
      </label>
   </td>
     <td>
       <input type="text" name="name" id="name" size="40" value="<?php echo $this->escape($this->user->get( 'name' ));?>" class="inputbox required" maxlength="50" /> *
     </td>
</tr>





<!-- Добавить код -->
           <input type="hidden" name="registerIp" id="registerIp" size="40" value="<?PHP  print($_SERVER['REMOTE_ADDR']); ?>" class="inputbox required" maxlength="15" />
<!-- ************ -->




<tr>
...


*****************************************************************************
4)Админка, добавление столбца RegisterIp

administrator/components/com_users/views/users/tmpl/default.php



<?php defined('_JEXEC') or die('Restricted access'); ?>

<?php  JHTML::_('behavior.tooltip');  ?>

<?php
   JToolBarHelper::title( JText::_( 'User Manager' ), 'user.png' );
   JToolBarHelper::custom( 'logout', 'cancel.png', 'cancel_f2.png', 'Logout' );
   JToolBarHelper::deleteList();
   JToolBarHelper::editListX();
   JToolBarHelper::addNewX();
   JToolBarHelper::help( 'screen.users' );
?>

<form action="index.php?option=com_users" method="post" name="adminForm">
   <table>
      <tr>
         <td width="100%">
            <?php echo JText::_( 'Filter' ); ?>:
            <input type="text" name="search" id="search" value="<?php echo htmlspecialchars($this->lists['search']);?>" class="text_area" onchange="document.adminForm.submit();" />
            <button onclick="this.form.submit();"><?php echo JText::_( 'Go' ); ?></button>
            <button onclick="document.getElementById('search').value='';this.form.getElementById('filter_type').value='0';this.form.getElementById('filter_logged').value='0';this.form.submit();"><?php echo JText::_( 'Reset' ); ?></button>
         </td>
         <td nowrap="nowrap">
            <?php echo $this->lists['type'];?>
            <?php echo $this->lists['logged'];?>
         </td>
      </tr>
   </table>

   <table class="adminlist" cellpadding="1">
      <thead>
         <tr>
            <th width="2%" class="title">
               <?php echo JText::_( 'NUM' ); ?>
            </th>
            <th width="3%" class="title">
               <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($this->items); ?>);" />
            </th>
            <th class="title">
               <?php echo JHTML::_('grid.sort',   'Name', 'a.name', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
               
            <th width="15%" class="title" >
               <?php echo JHTML::_('grid.sort',   'Username', 'a.username', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
            <th width="5%" class="title" nowrap="nowrap">
               <?php echo JText::_( 'Logged In' ); ?>
            </th>
            <th width="5%" class="title" nowrap="nowrap">
               <?php echo JHTML::_('grid.sort',   'Enabled', 'a.block', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
            <th width="15%" class="title">
               <?php echo JHTML::_('grid.sort',   'Group', 'groupname', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
            <th width="15%" class="title">
               <?php echo JHTML::_('grid.sort',   'E-Mail', 'a.email', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
            <th width="10%" class="title">
               <?php echo JHTML::_('grid.sort',   'Last Visit', 'a.lastvisitDate', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
            








<!-- Добавить код -->            
      <th width="11%" class="title" >
         <?php echo JHTML::_('grid.sort',   'RegisterIp', 'a.registerIp', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
      </th>
<!-- ************ -->            







            
            <th width="1%" class="title" nowrap="nowrap">
               <?php echo JHTML::_('grid.sort',   'ID', 'a.id', @$this->lists['order_Dir'], @$this->lists['order'] ); ?>
            </th>
         </tr>
      </thead>
      <tfoot>
         <tr>
            <td colspan="10">
               <?php echo $this->pagination->getListFooter(); ?>
            </td>
         </tr>
      </tfoot>
      <tbody>
      <?php
         $k = 0;
         for ($i=0, $n=count( $this->items ); $i < $n; $i++)
         {
            $row    =& $this->items[$i];

            $img    = $row->block ? 'publish_x.png' : 'tick.png';
            $task    = $row->block ? 'unblock' : 'block';
            $alt    = $row->block ? JText::_( 'Enabled' ) : JText::_( 'Blocked' );
            $link    = 'index.php?option=com_users&amp;view=user&amp;task=edit&amp;cid[]='. $row->id. '';

            if ($row->lastvisitDate == "0000-00-00 00:00:00") {
               $lvisit = JText::_( 'Never' );
            } else {
               $lvisit   = JHTML::_('date', $row->lastvisitDate, '%Y-%m-%d %H:%M:%S');
            }
         ?>
         <tr class="<?php echo "row$k"; ?>">
            <td>
               <?php echo $i+1+$this->pagination->limitstart;?>
            </td>
            <td>
               <?php echo JHTML::_('grid.id', $i, $row->id ); ?>
            </td>
            <td>
               <a href="<?php echo $link; ?>">
                  <?php echo $row->name; ?></a>
            </td>
            <td>
               <?php echo $row->username; ?>
            </td>
            <td align="center">
               <?php echo $row->loggedin ? '<img src="images/tick.png" width="16" height="16" border="0" alt="" />': ''; ?>
            </td>
            <td align="center">
               <a href="javascript:void(0);" onclick="return listItemTask('cb<?php echo $i;?>','<?php echo $task;?>')">
                  <img src="images/<?php echo $img;?>" width="16" height="16" border="0" alt="<?php echo $alt; ?>" /></a>
            </td>
            <td>
               <?php echo JText::_( $row->groupname ); ?>
            </td>
            <td>
               <a href="mailto:<?php echo $row->email; ?>">
                  <?php echo $row->email; ?></a>
            </td>
            <td nowrap="nowrap">
               <?php echo $lvisit; ?>
            </td>
            
            
            



<!-- Добавить код -->
         <td>
         <?php echo $row->registerIp; ?>
         </td>
<!-- ************ -->            
            



            
            
            <td>
               <?php echo $row->id; ?>
            </td>
         </tr>
         <?php
            $k = 1 - $k;
            }
         ?>
      </tbody>
   </table>

   <input type="hidden" name="option" value="com_users" />
   <input type="hidden" name="task" value="" />
   <input type="hidden" name="boxchecked" value="0" />
   <input type="hidden" name="filter_order" value="<?php echo $this->lists['order']; ?>" />
   <input type="hidden" name="filter_order_Dir" value="<?php echo $this->lists['order_Dir']; ?>" />
   <?php echo JHTML::_( 'form.token' ); ?>
</form>

*********************************************************************
5)Чтоб пользователи не меняли IP сами

components/com_user/controller.php



// we don't want users to edit certain fields so we will unset them
      unset($post['gid']);
      unset($post['block']);
      unset($post['usertype']);
      unset($post['registerDate']);
      unset($post['activation']);


// -- Добавить код -->
      unset($post['registerIp']);
// -- ************ -->



*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************

Блокировка регистрации по IP если нужно

\libraries\joomla\database\table\use.php


...

      // check for existing username
      $query = 'SELECT id'
      . ' FROM #__users '
      . ' WHERE username = ' . $this->_db->Quote($this->username)
      . ' AND id != '. (int) $this->id;
      ;
      $this->_db->setQuery( $query );
      $xid = intval( $this->_db->loadResult() );
      if ($xid && $xid != intval( $this->id )) {
         $this->setError(  JText::_('WARNREG_INUSE'));
         return false;
      }
      
      
//-- Добавить код -->      
      //проверка если такой Ip
      $query = 'SELECT id'
      . ' FROM #__users '
      . ' WHERE registerIp = ' . $this->_db->Quote($this->registerIp)
      . ' AND id != '. (int) $this->id;
      ;
      $this->_db->setQuery( $query );
      $xid = intval( $this->_db->loadResult() );
      if ($xid && $xid != intval( $this->id )) {
         $this->setError(  JText::_('WARNREG_REGISTERIP'));
         return false;
      }
// -- ************ -->      
      
      

      // check for existing email

...

*****************************************************************************************
Добовляем оповещение

\language\ru-RU\ru-RU.ini

WARNREG_REGISTERIP=Этот IP адрес уже используется другим пользователем.

\language\en-GB\en-GB.ini

WARNREG_REGISTERIP=This IP address is used by another user.


 :laugh:
« Последнее редактирование: 28.12.2011, 00:50:12 от cartgen »
*

Taatshi

  • Гуру
  • 5258
  • 481 / 2
  • Верстаем и кодим. Обращайтесь ;)
То есть, если, к примеру, на сайте захотим зарегистрироваться я и моя дочь, то одна из нас идет лесом... Смысл? К тому же если не стоит проверка по IP на каждое действие - что мешает мне зарегистрировать второй аккаунт с компьютера друга? Или через прокси?

Извините, но никаких плюсов, одни минусы.
ВЕРСТКА, САЙТЫ ПОД КЛЮЧ, УДАЛЕНИЕ ВИРУСОВ, МИГРАЦИЯ НА JOOMLA 3, ОБНОВЛЕНИЕ  |  ОТЗЫВЫ 
Связь: telegram - Taatshi, почта - Taatshi на яндексе, Skype - Taatshi
*

cartgen

  • Захожу иногда
  • 54
  • 8 / 2
Taatshi,   Основная цель, была записать IP в базу и потом посмотреть IP пользователя в админке.  При случае забанить по IP, соответствующими компонентами. Понятно, что защита никакая (динамические адреса, анонимайзеры и.т.д), но хоть что-то.

Блокировку с одинаковыми IP при регистрации можно вообще убрать.

Для чего блокировка ? У меня на сайте, файло-обменник. И система баллов ( Даешь файл +1, качаешь -1) При регистрации дается бонус +1 балл.
Что мешает людям, ничего не давая, просто регистрироваться повторно?

Оповещение, что есть такой IP можно убрать. Пользователь останется в форме регистрации и не поймет почему не регистрируется.
Кароче защита примитивная. Но больше не знаю, что придумать.
« Последнее редактирование: 27.12.2011, 19:21:32 от cartgen »
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
1. Зачем писать IP в форму и передавать в запросе, если он и так доступен через JSession?

2. Зачем делать так много хаков если вообще можно обойтись без них?
*

cartgen

  • Захожу иногда
  • 54
  • 8 / 2
1. Зачем писать IP в форму и передавать в запросе, если он и так доступен через JSession?

Ну не умею я им пользоваться. Как вытащить IP? Покажи пример, если не трудно.

2. Зачем делать так много хаков если вообще можно обойтись без них?

А как без них?
*

SDKiller

  • Живу я здесь
  • 2705
  • 329 / 5
  • ...ergo sum
... доступен через JSession

Ну это я погорячился, каюсь, в базе такого нет, плагинчик у меня один стоит, поэтому и доступен )))

Но сути это не меняет - зачем получать IP в форме, пересылать его в запросе да ещё морочить себе голову, как бы юзеры не подменили?

А тем более потрошить файлы ядра.

Делать всё без хаков плагином на onBeforeStoreUser
Там и IP получаем, можно традиционным методом, можно через класс JRequest - тогда переменные будут дополнительно отфильтрованы.

Код
$server = JRequest::get('server');
$ip = $server['REMOTE_ADDR'];

Чтобы не мучить стандартную таблицу можно создать отдельную и обращаться к ней из плагина.

И сохранять в неё IP на событие onAfterStoreUser если регистрация одобрена и пользователь сохранён.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не отображаются сообщения при регистрации и входе

Автор hogik

Ответов: 0
Просмотров: 1744
Последний ответ 02.04.2016, 13:33:53
от hogik
Как вевысти форму регистрации на главную?

Автор vinegred

Ответов: 25
Просмотров: 11785
Последний ответ 22.03.2016, 16:04:20
от Festival
Не даёт удалить пользователя

Автор Teplophizik

Ответов: 2
Просмотров: 2159
Последний ответ 21.10.2015, 08:26:15
от Teplophizik
Не приходит ссылка с активацией пользователя в mod_login, но сама почта приходит

Автор pinkfloyd

Ответов: 3
Просмотров: 4362
Последний ответ 12.12.2014, 20:45:05
от Sanita
Приветственное сообщение пользователям после успешной регистрации

Автор Metztli

Ответов: 3
Просмотров: 2806
Последний ответ 04.08.2013, 18:28:49
от Metztli