• Как вывести zoo - элемент на главную страницу?

    @exmmth
    CMS Joomla, JBZoo
    Здравствуйте, ded_luka!
    В админке, напротив списка элементов в колонке "Главная" стоит красные крест,

    - Если вы нажмете на на этот крест, он активирует публикацию у этого элемента на главной.

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

    Присоединяйтесь к нашему чату Zoo / JBzoo в телеграм
    Ответ написан
    1 комментарий
  • Убрать код AdSense с некоторых страниц на Joomla 3.10.5 (PHP 7.4)?

    @exmmth
    CMS Joomla, JBZoo
    <?php 
    echo JFactory::getURI()->toString(); /*полная ссылка https://site.ru/my_link?my_query#my_fragment  */
    echo JFactory::getURI()->toString(array('path', 'query', 'fragment')); /* ссылка частичная /my_link?my_query#my_fragment  */
    ?>

    Этих примеров, думаю, хватит, условия сравнения напишете сами.
    Документация по getURI() легко гуглится, если нужно что-то частное
    Ответ написан
    Комментировать
  • PHP при переборе массива разнести его на несколько областей?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Там придется заморочиться немного. У меня в магазине 2 меню:
    • одно - каталог товаров, где родительский пункт меню - один - "каталог"
    • второе - обычное меню с контактами, доставками и т.д.

    Вот для меню-каталога я сделал свой макет вывода mod_menu. В modules/mod_menu/tmpl есть 5 файлов:
    1. default.php - сам цикл по массиву с пунктами
    2. default_component.php - layout для вывода ссылки на компонент
    3. default_heading.php - заголовок
    4. default_separator.php - разделитель
    5. default_url.php - внешняя ссылка

    Все это дело копируем в ту же папку и заменяем в названии файлов "default" на что-то свое - catalog.php, catalog_component.php и т.д. В основном файле с циклом нужно имена лейаутов в switch-case подправить тоже на "catalog".

    В настройках модуля есть параметр "начальный уровень". Скрины для тройки, но в четверке то же самое должно быть.
    61f0c71d674c5467287356.png
    61f0c72b67ac9009266415.png
    У каждого элемента объекта с пунктами меню есть parent_id.
    $item->deeper - флаг, означающий, что есть вложенные пункты меню.
    $item->shallower означает, что это последний пункт меню (вообще в меню в целом) и можно ставить закрывающие теги.
    Нам нужно разделить меню на левую часть и правую часть. В пункты меню нужно вставить атрибуты ссылкам со всякими айдишниками, чтобы на js обрабатывать ховеры мышки. Это делается уже в файлах лейаутов.
    Вот код по нему может будет понятно.
    Catalog.php
    <?php
    /**
     * @package     Joomla.Site
     * @subpackage  mod_menu
     *
     * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */
    
    defined('_JEXEC') or die;
    use Joomla\CMS\Factory;
    use Joomla\CMS\Helper\ModuleHelper;
    
    $id = '';
    
    if ($tagId = $params->get('tag_id', ''))
    {
    	$id = ' id="' . $tagId . '"';
    }
    
    $main_menu = '<ul class="nav menu '.$class_sfx . ' mod-list'.$id.'">';
    
    $sub_menus = '';
    $sub_menu = '';
    
    // The menu class is deprecated. Use nav instead
    ?>
    
    	<?php foreach ($list as $i => &$item)
    	{
    		//если пункт меню верхнего уровня (из настроек)
    		if($params->get('startLevel', '') == $item->level){
    			$class = 'item-' . $item->id;
    
    			if ($item->id == $default_id)
    			{
    				$class .= ' default';
    			}
    
    			if ($item->id == $active_id || ($item->type === 'alias' && $item->params->get('aliasoptions') == $active_id))
    			{
    				$class .= ' current';
    			}
    
    			if (in_array($item->id, $path))
    			{
    				$class .= ' active';
    			}
    			elseif ($item->type === 'alias')
    			{
    				$aliasToId = $item->params->get('aliasoptions');
    
    				if (count($path) > 0 && $aliasToId == $path[count($path) - 1])
    				{
    					$class .= ' active';
    				}
    				elseif (in_array($aliasToId, $path))
    				{
    					$class .= ' alias-parent-active';
    				}
    			}
    
    			if ($item->type === 'separator')
    			{
    				$class .= ' divider';
    			}
    
    			if ($item->deeper)
    			{
    				$class .= ' deeper';
    			}
    
    			if ($item->parent)
    			{
    				$class .= ' parent';
    			}
    
    			$main_menu .= '<li class="nav-item d-flex ' . $class . '" data-target-id="'.$item->id.'">';
    
    			switch ($item->type) :
    				case 'separator':
    				case 'component':
    				case 'heading':
    				case 'url':
    					require ModuleHelper::getLayoutPath('mod_menu', 'catalog_' . $item->type);
    					break;
    
    				default:
    					require ModuleHelper::getLayoutPath('mod_menu', 'catalog_url');
    					break;
    			endswitch;
    
    				if ($item->deeper)
    				{
    					$sub_menu .= '<ul class="nav tab-pane fade'.$id.'" role="tabpanel" id="catalog-submenu-'.$item->id.'">';
    				}
    				elseif ($item->shallower)
    				{
    					$sub_menu .= '</ul>';
    				}
    				$main_menu .= '</li>';
    
    
    		} else {
    			$class = 'item-' . $item->id;
    
    			if ($item->id == $default_id)
    			{
    				$class .= ' default';
    			}
    
    			if ($item->id == $active_id || ($item->type === 'alias' && $item->params->get('aliasoptions') == $active_id))
    			{
    				$class .= ' current';
    			}
    
    			if (in_array($item->id, $path))
    			{
    				$class .= ' active';
    			}
    			elseif ($item->type === 'alias')
    			{
    				$aliasToId = $item->params->get('aliasoptions');
    
    				if (count($path) > 0 && $aliasToId == $path[count($path) - 1])
    				{
    					$class .= ' active';
    				}
    				elseif (in_array($aliasToId, $path))
    				{
    					$class .= ' alias-parent-active';
    				}
    			}
    
    			if ($item->type === 'separator')
    			{
    				$class .= ' divider';
    			}
    
    			if ($item->deeper)
    			{
    				$class .= ' deeper';
    			}
    
    			if ($item->parent)
    			{
    				$class .= ' parent';
    			}
    
    			$sub_menu .= '<li class="' . $class . '">';
    
    			switch ($item->type) :
    				case 'separator':
    				case 'component':
    				case 'heading':
    				case 'url':
    					require ModuleHelper::getLayoutPath('mod_menu', 'catalog_' . $item->type);
    					break;
    
    				default:
    					require ModuleHelper::getLayoutPath('mod_menu', 'catalog_url');
    					break;
    			endswitch;
    
    			// The next item is deeper.
    			if ($item->deeper)
    			{
    				$sub_menu .= '<ul class="nav-child unstyled small">';
    			}
    			// The next item is shallower.
    			elseif ($item->shallower)
    			{
    				$sub_menu .= '</li>';
    				$sub_menu .= str_repeat('</ul></li>', $item->level_diff);
    			}
    			// The next item is on the same level.
    			else
    			{
    				$sub_menu .= '</li>';
    			}
    		}
    	}
    	$main_menu .= "</ul>";
    	$sub_menu .= "</ul>";
    
    	$sub_menus .= $sub_menu;
    
    	?>
    <div class="mainmenu col-12 col-md-4 col-lg-3">
    	<?php
    		echo $main_menu;
    	?>
    </div>
    <div class="submenu bg-white col-12 d-md-block col-md-8 col-lg-9">
    	<div class="tab-content overflow-auto" id="catalog-submenu-tabContent" role="tablist">
    		<button class="btn btn-sm btn-outline-secondary d-md-none fas fa-chevron-left my-2" id="submenu-back-btn"><span class="ml-2">Назад</span></button>
    		<?php echo $sub_menus;?>
    	</div>
    </div>


    Для примера - catalog_component.php. Этот файл вызывается в предыдущем catalog.php с помощью ModuleHelper::getLayoutPath('mod_menu', 'catalog_' . $item->type); . $item->type там будет содержать название лейаута - component.

    <?php
    /**
     * @package     Joomla.Site
     * @subpackage  mod_menu
     *
     * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
     * @license     GNU General Public License version 2 or later; see LICENSE.txt
     */
    
    defined('_JEXEC') or die;
    
    $attributes = array();
    
    if ($item->anchor_title)
    {
    	$attributes['title'] = $item->anchor_title;
    }
    $attributes['class'] .= "nav-link w-100";
    if ($item->anchor_css)
    {
    	$attributes['class'] = $item->anchor_css;
    }
    
    if ($item->anchor_rel)
    {
    	$attributes['rel'] = $item->anchor_rel;
    }
    
    $linktype = $item->title;
    
    if ($item->menu_image)
    {
    	if ($item->menu_image_css)
    	{
    		$image_attributes['class'] = $item->menu_image_css;
    		$linktype = JHtml::_('image', $item->menu_image, $item->title, $image_attributes);
    	}
    	else
    	{
    		$linktype = JHtml::_('image', $item->menu_image, $item->title);
    	}
    
    	if ($item->params->get('menu_text', 1))
    	{
    		$linktype .= '<span class="image-title">' . $item->title . '</span>';
    	}
    }
    
    if ($item->browserNav == 1)
    {
    	$attributes['target'] = '_blank';
    }
    elseif ($item->browserNav == 2)
    {
    	$options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes';
    
    	$attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
    }
    
    
    //если пункт меню верхнего уровня (из настроек)
    if($params->get('startLevel', '') == $item->level){
    	$main_menu .= JHtml::_('link', JFilterOutput::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
    	if($item->deeper){
    		$main_menu .=  '<button class="btn ml-auto d-flex align-items-center mr-lg-2" data-target="catalog-submenu-'.$item->id.'" role="tab" id="child-menu-toggler-'.$item->id.'"><i class="fas fa-chevron-right"></i></button>';
    	}
    
    } else {
    	$sub_menu .= JHtml::_('link', JFilterOutput::ampReplace(htmlspecialchars($item->flink, ENT_COMPAT, 'UTF-8', false)), $linktype, $attributes);
    }


    Попробуйте доковырять под себя. Может поможет.
    Ответ написан
    Комментировать
  • На каком CMS лучше делать проекты?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    В комментарии правильно спросили: для каких целей? Джумла - инструмент, которым нужно уметь владеть. Под капотом у неё полноценный PHP фреймворк, хоть и немного устаревший, со стандартами PSR. Если Вы не разработчик, а делаете сайты-магазины на потоке, то с вп, наверное, будет быстрее на старте. Но чтоб добиться нужного качества потом потребуется больше усилий. Чистый вп с чистым вукоммерсом занимает около 180 мб кода. Это их просто поставили и всё. Чистая джумла с тем же джумшоппингом занимает около 35 мб кода. Где в итоге проще будет допиливать, как Вы думаете? Да и вордпрессе нет MVC структуры, поэтому ему под капот часто подключают лару или симфони. Тогда зачем вп нужен? В джумле таких проблем нет. Сам вопрос должен звучать немного по-другому: "что лучше и удобнее поддерживать и развивать в долгосрочной перспективе? " На джумле собирают всё: как сайты на коленке, так и магазины с более чем 32М товаров (автозапчасти и т. д.), новостники с >250к уников в сутки.
    Ответ написан
    Комментировать
  • На каком CMS лучше делать проекты?

    @exmmth
    CMS Joomla, JBZoo
    Берите joomla, вышла новая ветка 4.х как для разработчика много "вкусного", в феврале 4.1 зарелизится появятся ещё новые возможности.
    Вот дайджест за пол года https://habr.com/ru/post/592461/
    Присоединяйтесь к сообществу в телеграм общее https://t.me/joomlaru
    Чат именно для разработчиков https://t.me/projoomla с вопросами возникающими поможем и решениями программными поделимся!)
    Ответ написан
    Комментировать
  • Не работает условие if else. Где ошибка?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Перепишите на нормальный язык и увидите где ошибка:
    <?php 
    	if (is_array($this->product->extra_field)){
    		foreach($this->product->extra_field as $extra_field){
    			if ($extra_field["id"] == 1){
    				print $extra_field['value'];
    			}
    		}
    	// } - here is error 
    	}else{ 
    		print $this->product->description; 
    	} 
    ?>
    Ответ написан
    2 комментария
  • Добавляют ли файлы сайта на CMS в git?

    @ksnk
    Для joomla - нет. Получившийся репозиторий будет сложно (невозможно) использовать просто из за его гигантского размера. Единственный вариант - это какая-то застарелая, многолетне исправляемая в исходниках версия системы, которую просто страшно потерять. Надеюсь, это не такой случай :)
    Вообще - помещать в СВОЙ репозиторий нужно только СВОИ файлы - те, которые не идут с инсталляции системы и плагинов, а добавлены вручную.
    Нужно обязательно проверить, что репозиторий можно раскрутить в работоспособный проект с нуля, для этого служит композер или еще какие пакеты установки.
    Ответ написан
    Комментировать
  • Как победить cписок в изображениях в модулях?

    MKE
    @MKE
    PHP, JS, MySQL, HTML, CSS
    Вероятно, можно переопределить макет данного модуля в своём шаблоне. То есть создать PHP файл (копию стандартного макета) и отредактировать его - чтобы выводилось, как надо. При этаком подходе модификация файла не потеряется при обновлении модуля.
    https://cmscafe.ru/praktika/318-rukovodstvo-dlya-n...
    Ответ написан
    Комментировать
  • Почему не работает fancybox в joomla 3?

    @exmmth
    CMS Joomla, JBZoo
    Это стандартное поведение jQuery в режиме без конфликтов jQuery.noConflict вот ответ по аналогичной теме с пояснением почему jQuery а не $
    Не понимает символ $ Jquery?

    Вот так подключить jquery в Джумла без jQuery.noConflict
    JHtml::_('jquery.framework', false, null, false);
    почитать побольше о способах отключений на форуме https://joomlaforum.ru/index.php?topic=253684.0
    Ответ написан
    1 комментарий
  • Плагин joomla и php 7.4. Почему ошибка?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Имя класса и имя метода в классе не должны быть одинаковыми, тебе же ясным языком это написано.
    class plgSystemFeedGator extends JPlugin
    {
    protected $interval = 300;
    
    function plgSystemFeedGator( &$subject, $params )
    {
    parent::__construct( $subject, $params );
    Ответ написан
    3 комментария
  • Как создать API Joomla для работы с приложением?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Скорее всего имеется в виду REST API. Здесь зависит от компонента, который используется. Например, для интернет-магазина на JoomShopping можно использовать нативный аддон от разработчиков. Если для джумлы в целом - смотрите https://extensions.joomla.org/extension/rest-api/ Также здесь https://extensions.joomla.org/category/core-enhanc...
    Ответ написан
    2 комментария
  • Загрузка главной как статичной, как сделать?

    @exmmth
    CMS Joomla, JBZoo
    Вашу проблему решает кеширование Joomla, вот вам пару ссылок с подробностями как настраивать:
    https://wedal.ru/uroki-joomla/kak-uvelichit-skoros...
    https://joomla . center/baza-joomla/skorost-zagruzki-joomla/nastrojka-keshirovaniya-v-joomla
    https://cmscafe.ru/praktika/553-kesh-v-joomla-razb...
    Ответ написан
    2 комментария
  • Как убрать определенный component с определенной страницы?

    @exmmth
    CMS Joomla, JBZoo
    Здравствуйте Setitle!
    Но где определяется какой именно компонент на какой странице выводится? (они ведь не все скопом выводятся)

    Вам нужно в панели верхней найти пункт Меню - там будем меню помеченное иконкой Дом. В меню вы найдете пункт меню который является главной страницей, там и будут настройки того, что выводится на странице <jdoc:include type="component" /> . В пунктам меню определяется привязка к определенной странице компонента или к самому компоненту, от него будет строится дальнейшая навигация.
    Общий ликбез по joomla есть основные части:
    • Меню (Для адресации по страницам)
    • Компоненты (Расширения для основного контента на странице)
    • Материалы (это компонент для основного контента на странице в ядре Joomla)
      • Медиа-Менеджер (Управление фото и прочими файлами из папки /images/)
      • Поля (Расширение контента)


    • Модули (Дополнительные блоки для сайта)
    • Шаблоны (внешний вид, и папка /название_шаблона/html/ используется для переопределения шаблонов модулей и компонентов из папок com_virtuemart\views\...\tmpl в частности)
    • Плагины (Всевозможные манипуляции с сохранением, выводом и прочим)

    Таким образом я хочу убрать с главной этот каталог товаров около фильтра (вместо него будет слайдер). Как это сделать?
    Опытным путем (буквально перебрал все каталоги и файлы) было определено, что выводится оно отсюда \components\com_virtuemart\views\virtuemart\tmpl\default_products.php. Сам файл допилен руками, в него даже css стили впихнули. FACEPALM.

    Скопируйте файлы и \components\com_virtuemart\views\virtuemart\tmpl\default_products.php в папку шаблона \templates\имя_шаблона\html\com_virtuemart\virtuemart\default_products.php и изменяйте уже тут.
    Подробнее вывод данных и переопределения в Joomla и ещё про переопределения

    Если остались вопросы, задавайте в комментариях
    Ответ написан
    2 комментария
  • Какой синтаксис языковых файлов .ini в joomla?

    @exmmth
    CMS Joomla, JBZoo
    https://docs.joomla.org/Specification_of_language_files документация, с файлами перевода все вопросы отпадут!) Если нет, напишите в комментарии
    1. QQ экранирование двойных кавычек
    2. после равно "перевод" должен быть в двойных кавычках
    3. пример нет, не понял о чём речь, думаю что если качали перевод с официального сайта то там проблем быть с переводом не должно (при условии совпадений версионности виртумарта и перевода)
    4. %s используется для замен:
      файл .ini
      lAZY_READ="%s читаю"

      JText::sprintf('lAZY_READ', 'Невнимательно');
    5. точки с запятой (;) используется для комментария
    Ответ написан
    3 комментария
  • Лучшее введение в Joomla! 3+?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    У Joomla порог вхождения выше, чем у многих других CMS. Да и больше она тяготеет к фреймворку, чем просто к CMS. При изучении не пытайтесь опираться на терминологию из других CMS. "Плагин" в WordPress и "плагин" в Joomla - разные вещи, решающие разные задачи. Ресурсы Вам посоветовали, хорошие. Чат в телеграме активный и довольно дружелюбный, по сравнению со многими аналогичными.
    Ответ написан
    Комментировать
  • Лучшее введение в Joomla! 3+?

    @exmmth
    CMS Joomla, JBZoo
    Есть ресурсы статейные, обучающие:
    joomlaportal.ru
    cmscafe.ru
    wedal.ru
    Есть на youtube Куртеев и у него же joomla.center
    Есть документация Joomla для разработчиков на русском
    Есть форум русский Joomla и есть канал телеграм Joomla
    Ответ написан
    Комментировать
  • Как отключить autocomplate в joomle?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Причем тут сайт если это браузер так подставляет сохраненные логин/пароли?
    Ответ написан
    3 комментария
  • Как убрать отображение самой первой новости в модуле последних новостей джумла?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    В цикле foreach можно через continue пропускать нужные элементы и не обрабатывать их
    Ответ написан
    4 комментария
  • Можно ли отслежитвать изменения в модуле без переустановки?

    pavelcarcass
    @pavelcarcass
    ИТ-менеджер из г. Иркутска
    Я всегда вношу изменения в установленные модули в Joomla и они сразу вступают в силу, никакой переустановки модуля делать не требуется. Если вы не видите изменений, то, скорее всего, дело таки в кэше - или кэше браузера, или кэше Joomla, которые нужно очищать всякий раз после внесения каких-либо изменений в модули, шаблоны, плагины или компоненты Joomla.
    Ответ написан
    1 комментарий
  • Какую cms для сайта лучше выбрать?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Требования не какие-то исключительные. В принципе, все ведущие CMS имеют такой функционал. Чтоб дополнить цветник, назову Joomla. С REST можно тоже подружить. В этом году выйдет 4 мажорная версия, там REST из коробки идет.

    Вообще, при выборе CMS Вам нужно заглянуть в будущее и увидеть свой проект чуть более развитым, чем он есть сейчас. Тогда будет понятен стек функционала и технологий на перспективу. Возможно, нужны будут кастомные разработки под Ваш проект, тогда уже будут открываться детали: что где-то CMS тащит Legacy 10-летней давности ради того, чтобы сохранить обратную совместимость; что где-то Вы так и не добьетесь зеленой зоны в Google PageSpeed; где-то Вам сложнее будет найти хорошего специалиста (вернее, чтобы привлечь внимание хорошего специалиста потребуется больший бюджет).
    Ответ написан
    8 комментариев