Гриборий

Гриборий

С нами с 11 декабря 2014; Место в рейтинге пользователей: #254
Илья
31 мая 2017, 14:54
1
+1
Нужно создать плагин на событие OnDocFormSave
и в нем что-то типа этого:
<?php
if ($mode == 'new') {
  if ($resource->get('content')) {
    $contentext = preg_replace('/<span[^>]*>(.*)<\/span>/Ui', '\\1', $resource->get('content'));
    $contentext = preg_replace('~style="[^"]*"~i', '', $contentext);
    $resource->set('content', $contentext);
    $resource->save();
    }
  }
Василий Наумкин
29 мая 2017, 08:56
4
+3
В modstore.pro всё как раз сделано через теги miniShop2.

Вывод тегов товара в чанке:
{if count($product.tags)}
	<div class="tags">
		{foreach $product.tags as $tag}
			<a href="{$packages_url}/tag/{$tag}">{$tag}</a>
	        {/foreach}
	</div>
{/if}

При клике юзер переходит по ссылке /packages/tag/любойтег, для которой должен сработать плагин OnPageNotFound, проверяющий наличие секции tag в адресе:
$uri = trim(urldecode($_SERVER['REQUEST_URI']), '/');
$tmp = explode('/', preg_replace('#\?.*#', '', $uri));
if (count($tmp) == 3 && $tmp[1] == 'tag') {
    $value = preg_replace('#[^\w\s\.-]#u', '', $this->modx->stripTags(urldecode($tmp[2])));
    if (!empty($value)) {
        $this->modx->setPlaceholder('extras_tag', $value);
        $this->modx->resource = $this->modx->request->getResource('id', $this->modx->config['packages_id']);
        if ($this->modx->resource) {
            $this->modx->resource->set('longtitle', $this->modx->resource->longtitle . " ($value)");
            $this->modx->resource->set('pagetitle', $this->modx->resource->pagetitle . " ($value)");
        }
        $this->modx->sendForward($this->modx->config['packages_id'], ['merge' => true]);
    }
}

Дальше идёт загрузка страницы с выводом каталога, на которой вызывается mFilter2, где в &element указан не msProducts, а специальный сниппет-обёртка extraProducts. Он смотрит наличие выставленного плейсхолдера extras_tag, и вызывает уже msProducts:
if ($tag = $modx->getPlaceholder('extras_tag')) {
    $table = $modx->getTableName('msProductOption');
    $c = $modx->prepare("SELECT COUNT(product_id) FROM {$table} WHERE `key` = 'tags' AND `value` = '{$tag}'");
    if ($c->execute() && !$c->fetchColumn()) {
        $modx->sendRedirect($modx->makeUrl($modx->resource->id));
    }
    $scriptProperties['innerJoin']['Tag'] = [
        'alias' => 'Tag',
        'class' => 'msProductOption',
        'on' => 'Tag.key="tags" AND Tag.product_id = msProduct.id AND Tag.value = "' . $tag . '"',
    ];
}

return $modx->runSnippet('msProducts', $scriptProperties);

Так что да, теги в miniShop2 есть, но реализацию работы с ними на сайте я оставляю на совести разработчика.
Гриборий
11 февраля 2017, 17:36
1
+1
То есть,
$modx->cultureKey;
вернет значение объекта, переопределенное setOption.
А
$modx->getOption('cultureKey');
вернет исходную системную настройку.
Павел Романов
01 февраля 2017, 12:48
3
+2
Нужно создать в core/components директорию в соответствии с Вашим namespace.
В ней директорию lexicon и в ней уже папки по языкам.
То есть, если пространство называется langs, то так:
core
  components
    langs
      lexicon
        ru
        en
        ...

В каждой языковой папке создайте файл default.inc.php и пропишите туда Ваши переменные:
<?php
$_lang['link_home'] = 'На главную';
$_lang['feedback'] = 'Обратная связь';
$_lang['sitemap'] = 'Карта сайта';
...

После этого все записи появятся в словарях, их можно будет править и т. д.
Выводить надежнее так:
[[%link_home? &namespace=`langs`]]
Prihod
14 ноября 2016, 22:00
1
0
1) у тебя не правильная структура файла, в нем должны быть только название категорий и подкатегорий т/к при его загрузки у тебя не будет возможности указывать какое поле что значит как это делается для импорта товара. Вот так должен выглядеть твой файл импорта
Каталог;Постельное белье|Детское постельное белье
Постельное белье;Постельное белье (sub category1)|Постельное белье (sub category2)
Обрати внимание что указывать нужно от родительского каталога, а также имеет значение последовательность т/е в каждой последующей строке могут использоваться название категорий которые уже были созданы в предыдущих. В итоге ты получишь такое дерево каталогов
2) Обнови дополнение до 1.2.10 т/к в одном из обновлений я там затер один участок года импорта категорий
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Алексей
10 мая 2016, 11:18
4
0
Было бы классно как-то удобно и на виду расположить вот эти вот хоткеи MODX: