Новости Joomla

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

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

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

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

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

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

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

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla

JetBrains - один из мировых лидеров в разработке программного обеспечения для разработчиков. Её программные продукты - это IDE - профессиональные среды разработки, которые отличаются от простого блокнота/редактора с плагинами набором всевозможных инструментов для разработчиков, глубоким анализом кодовой базы, подсказками по ней и по языку программирования, отладкой ошибок и многим-многим другим. Одним из самых известных продуктов компании является IDE PHP Storm, который можно назвать отраслевым стандартом PHP-разработчика.

В статье How PhpStorm Helps Maintain PHP Open-Source Projects: Interviews and Real-World Examples в блоге компании описываются Open Source проекты, которым JetBrains оказывает поддержку (это могут быть бесплатные лицензии для разработчиков для некоммерческих проектов).

В список попали:

  • PHPUnit - фреймворк для unit-тестирования в PHP
  • Doctrine DBAL - библиотека для PHP, которая предоставляет лёгкий и гибкий слой для коммуникации с базой данных. Она поддерживает различные базы данных через единый и согласованный API.
  • CodeIgniter — популярный MVC-фреймворк для разработки на PHP
  • Joomla! - наша любимая CMS.

Эти названия (кроме "Joomla") чаще всего не слышат вебмастера и разработчики обычных сайтов и интернет-магазинов. Но эти названия хорошо знакомы PHP-разработчикам, которые создают сложные и высоконагруженные проекты и микросервисы. То, что Joomla оказалась в одном ряду с такими программными инструментами - делает ей честь.

🙏 За ссылку спасибо участнику нашего сообщества Ринату Кажетову (@rkazhet).

Подпишитесь на @joomlafeed

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

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Всем привет. Как удалить пункт меню "Помощь" из административной панели Joomla ( 1.5.14)?
Заранее спасибо за советы!
Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Удаление пункта меню из админки
« Ответ #1 : 21.04.2010, 17:23:54 »
Открой файл /administrator/modules/mod_menu/helper.php и закомментируй/удали строки:

Код: php
/*
* Help SubMenu
*/
$menu->addChild(new JMenuNode(JText::_('Help')), true);
$menu->addChild(new JMenuNode(JText::_('Joomla! Help'), 'index.php?option=com_admin&task=help', 'class:help'));
$menu->addChild(new JMenuNode(JText::_('System Info'), 'index.php?option=com_admin&task=sysinfo', 'class:info'));
и
Код: php
// Help SubMenu
$menu->addChild(new JMenuNode(JText::_('Help'),  null, 'disabled'));

*

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Re: Удаление пункта меню из админки
« Ответ #2 : 21.04.2010, 17:24:52 »
Большое тебе спасибо!
+
Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

MaxTishenko

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: Удаление пункта меню из админки
« Ответ #3 : 24.06.2011, 02:43:08 »
Fatal error: Call to a member function hasChildren() on a non-object in C:\home\1.loc\www\administrator\modules\mod_menu\menu.php on line 55

menu.php

<?php
/**
 * @version      $Id: menu.php 14401 2010-01-26 14:10:00Z louis $
 * @package      Joomla
 * @copyright   Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license      GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant to the
 * GNU General Public License, and as distributed it includes or is derivative
 * of works licensed under the GNU General Public License or other free or open
 * source software licenses. See COPYRIGHT.php for copyright notices and
 * details.
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die( 'Restricted access' );

jimport('joomla.base.tree');

class JAdminCSSMenu extends JTree
{
   /**
    * CSS string to add to document head
    * @var string
    */
   var $_css = null;

   function __construct()
   {
      $this->_root = new JMenuNode('ROOT');
      $this->_current = & $this->_root;
   }

   function addSeparator()
   {
      $this->addChild(new JMenuNode(null, null, 'separator', false));
   }

   function renderMenu($id = 'menu', $class = '')
   {
      global $mainframe;

      $depth = 1;

      if(!empty($id)) {
         $id='id="'.$id.'"';
      }

      if(!empty($class)) {
         $class='class="'.$class.'"';
      }

      /*
       * Recurse through children if they exist
       */
      //Строка 55
while ($this->_current->hasChildren())
      {
         echo "<ul ".$id." ".$class.">\n";
         foreach ($this->_current->getChildren() as $child)
         {
            $this->_current = & $child;
            $this->renderLevel($depth++);
         }
         echo "</ul>\n";
      }

      if ($this->_css) {
         // Add style to document head
         $doc = & JFactory::getDocument();
         $doc->addStyleDeclaration($this->_css);
      }
   }

   function renderLevel($depth)
   {
      /*
       * Build the CSS class suffix
       */
      $class = '';
      if ($this->_current->hasChildren()) {
         $class = ' class="node"';
      }

      if($this->_current->class == 'separator') {
         $class = ' class="separator"';
      }

      if($this->_current->class == 'disabled') {
         $class = ' class="disabled"';
      }


      /*
       * Print the item
       */
      echo "<li".$class.">";

      /*
       * Print a link if it exists
       */
      if ($this->_current->link != null) {
         echo "<a class=\"".$this->getIconClass($this->_current->class)."\" href=\"".$this->_current->link."\">".$this->_current->title."</a>";
      } elseif ($this->_current->title != null) {
         echo "<a>".$this->_current->title."</a>\n";
      } else {
         echo "<span></span>";
      }

      /*
       * Recurse through children if they exist
       */
      while ($this->_current->hasChildren())
      {
         if ($this->_current->class) {
            echo '<ul id="menu-'.strtolower($this->_current->id).'"'.
               ' class="menu-component">'."\n";
         } else {
            echo '<ul>'."\n";
         }
         foreach ($this->_current->getChildren() as $child)
         {
            $this->_current = & $child;
            $this->renderLevel($depth++);
         }
         echo "</ul>\n";
      }
      echo "</li>\n";
   }

   /**
    * Method to get the CSS class name for an icon identifier or create one if
    * a custom image path is passed as the identifier
    *
    * @access   public
    * @param   string   $identifier   Icon identification string
    * @return   string   CSS class name
    * @since   1.5
    */
   function getIconClass($identifier)
   {
      global $mainframe;

      static $classes;

      // Initialize the known classes array if it does not exist
      if (!is_array($classes)) {
         $classes = array();
      }

      /*
       * If we don't already know about the class... build it and mark it
       * known so we don't have to build it again
       */
      if (!isset($classes[$identifier])) {
         if (substr($identifier, 0, 6) == 'class:') {
            // We were passed a class name
            $class = substr($identifier, 6);
            $classes[$identifier] = "icon-16-$class";
         } else {
            // We were passed an image path... is it a themeoffice one?
            if (substr($identifier, 0, 15) == 'js/ThemeOffice/') {
               // Strip the filename without extension and use that for the classname
               $class = preg_replace('#\.[^.]*$#', '', basename($identifier));
               $classes[$identifier] = "icon-16-$class";
            } else {
               if ($identifier == null) {
                  return null;
               }
               // Build the CSS class for the icon
               $class = preg_replace('#\.[^.]*$#', '', basename($identifier));
               $class = preg_replace( '#\.\.[^A-Za-z0-9\.\_\- ]#', '', $class);

               $this->_css  .= "\n.icon-16-$class {\n" .
                     "\tbackground: url($identifier) no-repeat;\n" .
                     "}\n";

               $classes[$identifier] = "icon-16-$class";
            }
         }
      }
      return $classes[$identifier];
   }
}

class JMenuNode extends JNode
{
   /**
    * Node Title
    */
   var $title = null;

   /**
    * Node Id
    */
   var $id = null;


   /**
    * Node Link
    */
   var $link = null;

   /**
    * CSS Class for node
    */
   var $class = null;

   /**
    * Active Node?
    */
   var $active = false;


   function __construct($title, $link = null, $class = null, $active = false)
   {
      $this->title   = $title;
      $this->link      = JFilterOutput::ampReplace($link);
      $this->class   = $class;
      $this->active   = $active;
      $this->id      = str_replace(" ","-",$title);

   }
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

убрать из меню заголовки h3

Автор nexter

Ответов: 19
Просмотров: 7879
Последний ответ 03.02.2020, 18:49:47
от durte
При добавлении нового пункта меню не отображается содержимое

Автор Denko

Ответов: 2
Просмотров: 3290
Последний ответ 16.01.2020, 18:40:55
от Denko
Не нажимается пункт меню на мобильной версии

Автор Sensession

Ответов: 7
Просмотров: 4788
Последний ответ 04.01.2020, 16:45:27
от xpank
Не отображаются пункты в меню

Автор physic

Ответов: 20
Просмотров: 22998
Последний ответ 20.09.2019, 16:54:01
от beliyadm
Как в ARI Ext Menu добиться работы параметра "Показать в меню"?

Автор vasmed

Ответов: 1
Просмотров: 3537
Последний ответ 01.03.2019, 11:12:18
от vasmed