man

man

С нами с 04 января 2016; Место в рейтинге пользователей: #237
Василий Наумкин
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 есть, но реализацию работы с ними на сайте я оставляю на совести разработчика.
Евгений Webinmd
11 апреля 2017, 23:04
1
+1
1) делаете форму
<form action="[[~[[*id]]]]" method="get">
	<select name="limit" onchange="this.form.submit()">
		<option value="10">10</option>
		<option value="20">20</option>
		<option value="30">30</option>
	</select>
</form>

2) в сниппет вывода добавляете тип такого
[[!pdoPage?
...
&limit=`[[#GET.limit]]` 
...
]]
это для направления в нужную сторону, не тестировал, но должно помочь
не заметил что Решено, оставлю для себя уже.
Fi1osof
11 апреля 2017, 16:59
2
+2
Посмотрите www.paysera.com/v2/ru-RU/index
Очень интересный мировой сервис. Главная фишка в том, что он учитывает законодательство различных стран при формировании платежей. То есть если участники платежа находятся в разных странах, будет выбрана оптимальная банковская цепочка и юридические моменты учтены.
Не совсем точно изучал вопрос оплаты в России в разных валютах, но вы почитайте у них, наверняка все можно.
Готового компонента сейчас нет, но на одном сайте клиенту интегрировал, так что вполне можно докрутить и оформить в компонент. Цена вопроса 10 000. Если будут другие заинтересованные пользователи, можно объявить краудфандинг и собраться вскладчину. Цена готового компонента будет 1990 рублей, по краудфандингу можно по 1000 оформить.
PG
PG
02 апреля 2017, 16:30
1
0
Смотрите в консоль браузера

$(document).ready(functon() { 
     AjaxLoadItems("http://giardino.adtov.ru/ajaxitems.html", "2"); 
    console.log(AjaxLoadItems("http://giardino.adtov.ru/ajaxitems.html", "2"))
});
для начала там должно быть function()

в корзину оно то добавляет, вот только уведомлений об этом нет
Володя
30 марта 2017, 19:00
6
+3
пример вывода всех тегов
<!-- tags -->
{set $tags = $_modx->runSnippet('pdoResources',[
'class' => 'msProductOption',
'sortby' => 'value',
'sortdir' => 'ASC',
'where' => json_encode([
'key' => 'tags',
'value:!='=> 'undefined'
]),
'select' => 'DISTINCT(msProductOption.value) as id, "tag" as class_key',
'limit' => 0,
'return' => 'json'
])}
{set $tags = $tags | fromJSON}
{if count($tags)}
	<ul class="uk-float-right uk-navbar-nav tm-header-tags">
		<li data-uk-dropdown="" aria-haspopup="true" aria-expanded="false">
			<a>{'msfbshop_tags' | lexicon}</a>
			<div aria-hidden="true" class="uk-dropdown uk-dropdown-navbar uk-dropdown-bottom">
				<ul class="uk-nav uk-nav-navbar">
				{foreach $tags as $row}
					<a href="{$row.link}">{$row.id}</a>
				{/foreach}
				</ul>
			</div>
		</li>
	</ul>
{/if}
Дмитрий
29 марта 2017, 12:44
2
+1
Примерно так это выглядит для Revo (взял из одного проекта, и не проверяя подкорректировал).
<?php
set_time_limit(500);
$modx->setDebug(E_ALL & ~E_NOTICE); // sets error_reporting to everything except NOTICE remarks
$modx->setLogLevel(modX::LOG_LEVEL_DEBUG);
$result = $modx->query("SELECT k2.id,k2.title, k2.fulltext, k2.introtext, k2.created, k2.hits, k2.alias, FROM `joomlasite_k2_items` k2";
if (!is_object($result)) {
    return 'No result!';
} else {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
                $data['pagetitle'] = $row['title'];
                $data['content'] = $row['introtext'];
                $data['template'] = 4;
		$data['context_key'] = 'web';
                $data['createdon'] = strtotime($row['created']);
                $data['tvs'] = true;
                $data['tv43'] = $row['hits'];
                $response = $modx->runProcessor('resource/create', $data);
                if ($response->isError()) {
                    html .= ($modx->error->failure($response->getMessage())) . '<br />
</br>?';
                } else {
                    $object = $response->getObject();
                    $html .= "
Был обновлен документ с ID {$object['id']}";
                }
}
return $html;
Но дело в том, что в Revo есть процессоры, а в Evo, вроде бы (последний раз работал с Evo в 2014), нет.
А смысл простой — взять нужные данные из таблиц Джумлы, завернуть их в массив и вставить с помощью какой-то матери в таблицу для Evo. Если погуглить, то можно найти такую ссылку. Осталось только присобачить пример выше к примеру по ссылке и добавлять данные как-то так, судя по статье:
// где $new_document это массив с данными из базы.
$newDocId = $modx->db->insert( $new_document, $modx->getFullTableName('site_content') );
Сергей Шлоков
24 марта 2017, 10:06
3
+2
Держи.
<?php
switch ($modx->event->name) {
	case 'OnManagerPageBeforeRender':
		$script = "<script>\n\t";
		$script .= "function setLogoutTimer(){if (logoutTimer) clearTimeout(logoutTimer); return setTimeout(function(){location.href='?a=security/logout';}, ".$modx->getOption('admin_logout_time', null, 20)."*60000);};"."\n\t";
		$script .= "var logoutTimer = setLogoutTimer();\n\t";
		$script .= 'document.addEventListener( "click" , function() {logoutTimer = setLogoutTimer();}, true);'."\n\t";
		$script .= 'document.addEventListener( "mousemove" , function() {logoutTimer = setLogoutTimer();}, true);'."\n\t";
		$script .= 'document.addEventListener( "contextmenu" , function() {logoutTimer = setLogoutTimer();}, true);'."\n\t";
		$script .= 'document.addEventListener( "wheel" , function() {logoutTimer = setLogoutTimer();}, true);'."\n\t";
		$script .= 'document.addEventListener( "keydown" , function() {logoutTimer = setLogoutTimer();}, true);'."\n";
		$script .= "</script>";
		$modx->controller->addHtml($script);
	break;
}
Выставлять время в минутах можно в системной настройке admin_logout_time.

П.С. В боевом режиме не тестировал.
Алексей Соин
21 марта 2017, 08:44
1
+1
Весь сайт сделан на Fenom и файловых сниппетах — работает раза в 2 быстрее старого. 85/95 по мнению Google PageSpeed
Хотелось бы по подробнее узнать как реализовано использование файловых сниппетов на новом модсторе, тоже хочу перевести свои сайты на такой способ, нашёл такой туториал.