• CMS с rest api?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    В joomla 4 есть REST API.
    Ответ написан
    Комментировать
  • Каким образом можно получить цены и остатки товаров ИЗ Битрикс 24?

    sergeytolkachyov
    @sergeytolkachyov Автор вопроса
    https://web-tolk.ru
    Проблема решена несколькими запросами к REST API:
    Количество товаров можно получить методом catalog.product.list.
    $resultBitrix24ProductQuantity      = CRest::call("catalog.product.list", [
    					'select' => [
    						'id', 'iblockId', 'name', 'quantity', 'xmlId'
    					],
    					'filter' => [
    						'id'       => $b24_product_id, // Фильтр по id Товара
    						'iblockId' => $task_params->default_bitrix24_store_iblock_id // id товарного каталога
    					]
    				]);
    // В ответе массив
    // Если в Битрикс 24 указана цена 0, то в ответе по REST API придёт ничего - пустота.
    // проверяйте на empty()
    $resultBitrix24ProductQuantity['result']['products'][0]['quantity'];

    Цену товара получаем методом catalog.price.list:
    $resultBitrix24ProductPrice      = CRest::call("catalog.price.list", [
    					'select' => [
    						'price'
    					],
    					'filter' => [
    						'productId' => $b24_product_id, // Фильтр по id Товара
    					]
    				]);
    // В ответе массив
    $resultBitrix24ProductPrice['result']['prices'][0]['price'];
    Ответ написан
    Комментировать
  • Как проще перенести контент с Joomla 2.5 на Joomla 4.2.3?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Я бы попробовал именно поступенными миграциями. Если только контент используется, без сторонних расширений, то должно нормально пройти всё.
    Только учтите, что при обновлении с 3.10.11 до четверки нужно сначала обновиться до 4.0.4 (обязательно), а потом уже можно и до последней. Найдено опытным путём.
    Ответ написан
  • Как удалить папку установки joomla с хостинга?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Можно поискать как это сделано в инсталляторе Joomla. Он же делает то же самое.
    Ответ написан
    Комментировать
  • Есть ли расширение для автоматического создания мини-эскизов изображений в статьях Joomla 4?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Скорее всего плагин использует устаревшие методы Joomla 2.5-3.x, поэтому не запускается. По идее допилить не сложно, но для начала нужно поискать актуальную версию на сайте разработчика. Если её нет, то можно спросить в телеграм-чате Joomla сообщества, там подскажут что делать.
    Вообще зависит от того, как Ваши картинки помещены в статью. Есть JCE MediaBox, есть плагин Simple Image Gallery, есть плагин Universal Plugin - одно из actions - создание галереек https://extensions.joomla.org/extension/authoring-...
    Ответ написан
    Комментировать
  • Какое решение выбрать, чтобы можно было создать структуру организации и поддерживать её?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Слишком мало вводных. Что потом дальше будет с этой структурой? На чем сделан сайт? Если с нуля - joomla и компонент Контакты из коробки идёт. "Красиво" - это не к движку, а к вёрстке.
    Ответ написан
    Комментировать
  • Вывод модуля на joomla 3 там где нужно?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Нужно смотреть код шаблона. Возможно, что хардкором их вывели
    Ответ написан
    Комментировать
  • Как вывести нужную информацию из массива?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Если joomla 4,то обращение к базе должно быть через DI-контейнер.
    Ответ написан
    Комментировать
  • На какой cms начать верстать магазин лучше всего?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    С джумлой всё нормально, на четвёрке делаю магазины. С ней, точно так же как и с любым другим инструментом нужно включать голову и делать по уму. Под капотом php фреймворк с полноценным MVC, в четвёрке есть REST API.
    По сути, главное что нужно - прямые руки и документирование всего того, что делается. Так как правильно написали, что любой магазин становится самописом как только начинает продавать. С джумлой самопис делать удобнее.
    И важно понимать (хотя это к любому бесплатному движку относится), что джумла - не система, для которой можно накупить варезных модулей и плагинов по 300 рублей и сляпать магазинчик. Делать хорошо - в любом случае дорого. Если есть вопросы - спросите у сообщества, которое есть у любого движка. Знающие люди подскажут как стратегически, так и практически. Приходите в чат джумлы в телеграме.
    Ответ написан
    7 комментариев
  • Хлебные крошки на Joomla 3?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Использовать стандартный модуль mod_bredcrumbs и в папке tmpl модуля скопировать, переименовать макет. Затем делать в нём всё, что душа пожелает. В настройках модуля выбрать этот макет
    Ответ написан
    Комментировать
  • Как создать свой тип данных в Joomla?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Вариант 1 - на Joomla Extensions Directory найти готовый компонент портфолио, установить и заполнять.
    Вариант 2 - воспользоваться материалами Joomla с переопределением макета и пользовательскими полями. Вот статья-мануал, описывающая принцип. Дальше Вы делаете под себя так, как нужно Вам.
    Ответ написан
    Комментировать
  • Как в Joomla 3 вывести плагин в плагине?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Нужно в коде плагина вызвать нужное событие и передать ему нужные данные.
    Factory::getApplication()->triggerEvent('event_name', ['option1'=>'option_value', 'option2'=>'option_value']);
    Ответ написан
    Комментировать
  • 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к уников в сутки.
    Ответ написан
    Комментировать
  • Настройка материалов (меню) в MyCitySelector?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Стоит обратиться к документации. Насколько помню, там можно создать разные меню на каждый город и модули показывать по условию. Но это хардкодится уже в шаблоне, скорее всего. Хелпер для интеграций там есть.

    [city Омск]<jdoc:include type="modules" name="demo1" style="" />[/city]
    [city Чита]<jdoc:include type="modules" name="demo2" style="" />[/city]
    Ответ написан
    Комментировать
  • Почему не работают категории к2 joomla?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Что стоит кроме К2? Повторите вопрос в Telegram-чате русскоязычного сообщества Joomla, оперативнее подскажут.
    Ответ написан
    Комментировать
  • Как вытащить векторные изображения из Joomla?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    Смотрите пути в HTML-коде и по FTP проще скачать.
    Ответ написан
    Комментировать
  • Как сделать зависимость способа доставки от адреса в Joomla?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    На каком компоненте сделан магазин?
    Ответ написан
    Комментировать
  • Вставить php код в Joomla модуль?

    sergeytolkachyov
    @sergeytolkachyov
    https://web-tolk.ru
    1. Создайте модуль типа HTML-код.
    2. В папке modules/mod_custom/tmpl создайте свой макет вывода - скопируйте и переименуйте default.php
    3. В этом default.php делайте всё, что хотите.
    4. Выведите этот модуль в нужной Вам позиции
    Ответ написан
    Комментировать