Новости 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 для атрибута addfieldprefix
namespace 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 #разработка

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

Анатолий115

  • Новичок
  • 2
  • 0 / 0
Добрый день, подскажите кто сталкивался с jv_menus, как удалить циклические ссылки?
Код
<?php
/**
* @version 1.5.x
* @package JoomVision Project
* @email webmaster@joomvision.com
* @copyright (C) 2008 http://www.JoomVision.com. All rights reserved.
*/
// No direct access
defined('_JEXEC') or die();
/**
 * Class Menu Common
 *
 */
class MenuSystem{
var $_name = null;
        var $_template = null;
        var $_start = null;
        var $_end = null;
        var $_suffix = null;
        var $_active = null;
        var $_type = null;
        var $_cache = null;
        var $_nav = null;
        var $Itemid = null;
       
/**
* Enter description here...
*
* @param string $name
* @param string $menutype
* @param string $template_name
* @param string $suffix
* @return MenuSystem
*/
function MenuSystem( $name,$menutype,$template_name, $rtl, $suffix="" ){
global $Itemid;
$this->_name = $name;
            $this->_template = $template_name;
            $this->_suffix = $suffix;
            $this->_type = $menutype;
            $this->Itemid = $Itemid;
            $document =& JFactory::getDocument();
            $document->addStyleSheet(JURI::base().'templates/'.$this->_template.'/jv_menus/'.'jv_'.$this->_name.'menu/'.'jv.'.$this->_name.'menu.css');
if($rtl == 'rtl')
$document->addCustomTag('<script type="text/javascript" src="'.JURI::base().'templates/'.$this->_template.'/jv_menus/'.'jv_'.$this->_name.'menu/'.'jv.'.$this->_name.'menu.rtl.js"></script>');
else
$document->addCustomTag('<script type="text/javascript" src="'.JURI::base().'templates/'.$this->_template.'/jv_menus/'.'jv_'.$this->_name.'menu/'.'jv.'.$this->_name.'menu.js"></script>');
            $this->genmenu();
}                       
function hasChild($lvl) {
$pid = $this->fatherId ($lvl);
if (!$pid) return false;
            if (@$this->_nav[$pid]) return true;
            else return false;
}
        function _showMenuDetail($row, $level = 0) {
            $_temp = null;
            $title = "title=\"$row->name\"";
            $menu_params = & new JParameter ($row->params);

            if ($menu_params->get('menu_image') && $menu_params->get('menu_image')!= -1) {
                    $str = '<img src="images/stories/'.$menu_params->get('menu_image').'" alt="'.$row->name.'" /><span class="menusys_name">'.$row->name.'</span>';
            } else {
                $str = '<span class="menusys_name">'.$row->name.'</span>';
            }
           
            $Class = $this->activeClass ($row, $level);

            $id='id="menusys'.$row->id.'"';

            if ($row->url != null) {
                if ($row->browserNav == 0) {
                    $menuItem = '<a href="'.$row->url.'" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>';



                } elseif ($row->browserNav == 1) {
                    $menuItem = '<a target="_blank" href="'.$row->url.'" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>';
                } elseif ($row->browserNav == 2) {
                    $url = str_replace('index.php', 'index2.php', $tmp->url);   
                    $atts = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=500,height=350';
                    $menuItem = '<a href="'.$url.'" onclick="window.open("'.$url.'",\'targetWindow\',\''.$atts.'\'); return false;" '.$Class.' '.$id.' '.$title.'>'.$str.'</a>';
                }
            } else {
                $menuItem = '<span '.$active.' '.$id.' '.$title.'>'.$str.'</span>';

            }
               
            echo $menuItem;
        }     
function show($start=0, $end = 14) {
$this->_start = $start;
$this->_end   = $end;
            echo "<div class=\"menusys_".$this->_name.$this->_suffix."\">";
if ($this->_start == 0) {
                //~~ Only first level will be shown ~~
$this->showMenu (0, 0);
}else{
$parID = $this->fatherId($this->_start);
if ($parID) $this->showMenu ($parID, $this->_start);
}
            echo "</div>";
}
function showMenu($pid, $level) {
if (@$this->_nav[$pid]) {
                if ($level == 0) {
                    echo "<ul id=\"menusys_".$this->_name."\">";
                } elseif($level == 1 && ($this->_name == 'submoo' || $this->_name == 'split')) {
echo "<ul id=\"menusub_".$this->_name."\">";
} else {
                    echo "<ul>";
                }
$i = 0;
foreach ($this->_nav[$pid] as $menu) {
if(@$this->_nav[$menu->id])
$abc = " hasChild";
else
$abc = "";
if ($i == 0) echo '<li class="first-item'.$abc.'">';
                    elseif ($i == count($this->_nav[$pid]) - 1) echo '<li class="last-item'.$abc.'">';
                    else echo '<li class="'.$abc.'">';
                    $this->_showMenuDetail( $menu, $level);
    if ($level < $this->_end) $this->showMenu( $menu->id, $level+1 );
$i++;
                    echo "</li>";
}

echo "</ul>";
            }
}
        function activeClass ($menu_item, $level) {
            return (in_array($menu_item->id, $this->_active))? " class=' active'" : " class=' item'";
        }
        //~~ This function will found the father ID of and item marked by level in array of active items ~~~~~~~
function fatherId ($lvl) {
            if (!$lvl) return 0;
            //echo "<pre>";print_r($this->_active);exit;
if (count($this->_active) < $lvl) return 0;
            $parID = count($this->_active) - $lvl;
return $this->_active[$parID];
}
       
/**
* Generate the menu
*
* @return mixed
*/
        function  genmenu(){
            $nav          = @JMenu :: getInstance();
       
            $my           = &JFactory::getUser();
            $nav          = array();
             
            $this->_cache = array();
            if(@strtolower(get_class($menu)) == 'jexception') {
                $nav = @JMenu :: getInstance('site');
            }
            $menus = &JSite::getMenu();
            $rows = $menus->getItems('menutype', $this->_type);
            $_tmp = array();
            if (count($rows)) {
               foreach ($rows as $key => $value) {
                if ($value->access <= $my->get('gid')) {
                    $par = $value->parent;
                    $list_menu = @ ($nav[$par])? $nav[$par] : array ();
if ($value->type == 'separator') {
    $value->_index = count($list_menu);
    $list_menu[] = $value;
    $nav[$par] = $list_menu;
    $this->_cache[$value->id] = $value;
    $_tmp[$value->id] = $key;
continue;
                    } elseif ($value->type == 'url') {
                        if ((strpos($value->link, 'index.php?')!== false) && (strpos($value->link, 'Itemid=') === false)) {
                            $value->url = $value->link.'&amp;Itemid='.$value->id;
                        } else {
                            $value->url = $value->link;
                        }   
                    } else {
                        $router = JSite::getRouter();
                        if ($router->getMode() == JROUTER_MODE_SEF) {
                            //~~ No JRoute now ~~~
                            $value->url = 'index.php?Itemid='.$value->id;
                        } else {
                            //~~ No JRoute now ~~~
                            $value->url = $value->link.'&amp;Itemid='.$value->id;   
                        }
                    }
                    $value->_index = count($list_menu);
                    $list_menu[] = $value;
                    $nav[$par] = $list_menu;
                }
                $this->_cache[$value->id] = $value;
                $_tmp[$value->id] = $key;
            }
        }
            $this->_nav = $nav;
            //~~ Find out what submenus this item has ~~~~~~~~~~~
            $active = array ($this->Itemid);
            $max = 14;
            //~~ We dont need more than 14 levels of menu, do we? ~~~
            $id = $this->Itemid;
            while ($max) {
                if (isset($_tmp[$id])) {
                    $tmp = $_tmp[$id];
                    if (isset ($rows[$tmp]) && $rows[$tmp]->parent > 0) {
                        $id = $rows[$tmp]->parent;
                        $active[] = $id;
                    } else {
                        break;
                    }
                }
                $max--;
            }
            $this->_active = $active;
        }
}
?>

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

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

Автор nexter

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

Автор Denko

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

Автор Sensession

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

Автор physic

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

Автор vasmed

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