Виталий Греков

Виталий Греков

С нами с 29 мая 2013; Место в рейтинге пользователей: #390
Наумов Алексей
04 марта 2017, 09:57
1
+2
Идея изначально у сео конторы была верная, а вот реализация подкачала)

По п1., как правильно:

Делаем меню

Чайники
|_ Электрические
|_ Газовые
А ниже него делаем фильтр с галочками

Назначение:
— Кухонные
Материал
— Пластик
— Метал
В итоге покупатель может выбрать:
1. Чайники электрические
2. Чайники электрические кухонные
3. Чайники электрические кухонные металлические

И вот эти все 3 страницы можно оптимизировать, как того хотят сеошники.
И покупателям ОЧЕНЬ УДОБНО при этом!

По п2.
Да в принципе идея ясна, пользуйтесь активно pagetitle, longtitle, menutitle и в нужных местах выводите длинное название, в нужных модель, чтобы было понятно. Например в корзине крупно название модели а ниже ее длинное название, тут компромис нужен
Іван Клімчук
17 февраля 2017, 10:39
2
+4
Быстрого и короткого решения нет, но если по механике всего действа, то я так делал. Менеджеры могут видеть только заказы минишопа.
Создал группу, куда поместил этих пользователей. Создал свою политику доступа (вернее две). Одну унаследовал от политики, которая идет с minishop2 (там чуть-чуть подтюнил один момент, чтобы нельзя было удалять заказ. Такой настройки нет в minishop2 сейчас, пришлось подправить исходники, не забыть бы PR Василию выслать), вторую от контент менеджера и поснимал галки со всех действий, которые мне были нужны (в частности запретил изменять как либо все ресурсы — требование заказчика). Затем эти политики доступа привязал в группе к контексту mgr. С правами на этом все, но осталась проблема, что нужно было после входа сразу отправлять пользователя в заказы минишопа, стандартных средств в MODX это сделать я не нашел, но решение есть. Создается панель (dashboard), которая назначается группе и пользователь попадает после входа на эту панель. А в самой панели я создал виджет, которые просто редиректит на заказы минишопа. В итоге, после входа пользователь сразу перенаправляется на нужную страницу.
В общем, коротко не получилось, но я предупреждал, что быстрого и короткого решения нет :)
На следующей неделе, если получится, запишу урок на эту тему.
Вадим
10 февраля 2017, 16:29
2
+2
А-а, так вам нужны закрытые каталоги? доступ к базе? конфиги и разные вкусности? :) Тогда у вас проблема с безопасностью. Вам надо было спрашивать — «Как закалить сайт на modx?»
Вот здесь посмотрите Hardening Your MODX Site
Наумов Алексей
26 января 2017, 15:24
3
+1
Нужен плагин, примерно такой:

<?php
if ($modx->event->name == 'OnLoadWebDocument') {
  $request = $_SERVER['REQUEST_URI'];
  $params = '';
  if (strpos($request, '?') !== false) {
  	list($request, $params) = explode('?', $request);
  }
  $uri = $request;
  if(!empty($uri) && strpos($uri, '.') === false && substr($uri, -1, 1) != '/') {
    $uri .= '/';
    if (!empty($params)) {
      $uri .= '?' . $params;
    }
    $modx->sendRedirect($uri, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
  }
}
Максим Кузнецов
06 января 2017, 19:56
1
0
Если задача — избавиться от гет-параметров в пользу чпу, то примерно так:
1. В чанках оформления кнопок фильтров прописываем адрес в виде ссылки, например так:
<label>
	<a href="[[~2]]/[[+value]]" [[+checked:is=``:then=``:else=` active`]]> [[+title]]</a>
</label>
где 2 — вымышленный путь до страницы каталога site.ru/catalog/

2. Реализуем кастомную маршрутизацию, с помощью которой страницы вида site.ru/catalog/лофт/ будет подставлять нужную страницу и вбивать желаемый гет-параметр. Альтернативно можно передавать не гет-параметр, а плейсхолдер, который впоследствии вставлять в &where сниппета, отображающего товары.
Андрей
15 декабря 2016, 16:47
1
+2
Тоже недавно возникла такая задача, решил написанием плагина.

Вешается на событие OnLoadWebDocument, так же создал TV поля pattern-seo-title, pattern-seo-keywords, pattern-seo-description.

if ($modx->event->name == 'OnLoadWebDocument') {
    
  function getMeta($id) {
    global $modx;
    
    if ($resource = $modx->getObject('modResource', $id)) {
      
      $title = $resource->getTVValue('pattern-seo-title');
      $keywords = $resource->getTVValue('pattern-seo-keywords');
      $description = $resource->getTVValue('pattern-seo-description');

      if ((isset($title) && !empty($title)) || (isset($keywords) && !empty($keywords)) || (isset($description) && !empty($description))) {
        $modx->setPlaceholder('pattern.seo.title', $title);
        $modx->setPlaceholder('pattern.seo.keywords', $keywords);
        $modx->setPlaceholder('pattern.seo.description', $description);
      } else {
        getMeta($resource->get('parent'));
      }        
    }
  }
  
  $id = $modx->resource->parent;
  
  getMeta($id);
    
}

В разделе для которого нужно применить шаблон, в TV полях уже можно писать например — "«[[*pagetitle]]»" купить, "«[[*pagetitle]]»" цена и отзывы, инструкция по применению — "«[[++site_name]]»"

В шаблоне выводятся как плейсхолдеры [[+pattern.seo.title]], [[+pattern.seo.keywords]], [[+pattern.seo.description]]

Я выводил так, на Fenom

{set $pattern_seo_title = $_modx->getPlaceholder('pattern.seo.title')}
{set $pattern_seo_keywords = $_modx->getPlaceholder('pattern.seo.keywords')}
{set $pattern_seo_description = $_modx->getPlaceholder('pattern.seo.description')}

{if $_modx->resource['seo-title']?}
	{$_modx->resource['seo-title']}
{elseif $pattern_seo_title?}
	{$pattern_seo_title}
{else}
	{$_modx->resource.pagetitle}
{/if}

{if $_modx->resource['seo-keywords']?}
	{$_modx->resource['seo-keywords']}
{else}
	{$pattern_seo_keywords}
{/if}

{if $_modx->resource['seo-description']?}
	{$_modx->resource['seo-description']}
{else}
	{$pattern_seo_description}
{/if}
Дмитрий
27 ноября 2016, 17:36
3
0
Пример ajax.php, который использую в последних проектах.
Работает исправно, все парсится и работает.
<?php

define('MODX_API_MODE', true);
require 'index.php';
//подключаем pdoTools
$pdo = $modx->getService('pdoTools');
// Откликаться будет ТОЛЬКО на ajax запросы
if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
    return;
}
// Сниппет будет обрабатывать не один вид запросов, поэтому работать будем по запрашиваемому действию
// Если в массиве POST нет действия - выход
if (!empty($_POST['action'])) {
    switch ($_POST['action']) {
        case 'snippetName':
            $tvs = $_POST['tvs'];
            if (!empty($tvs)) {
                $res = $pdo->runSnippet('@FILE snippets/snippetName.php', array('tvs' => $tvs));
            }
            if (empty($res)) {
                $res = 'Подходящих записей не найдено. Попробуйте упростить параметры поиска';
            }
            break;
    }
} else {
    return;
}
if (!empty($res)) {
    die($res);
}
stas
08 ноября 2016, 09:42
1
0
[[!msProducts?
                      &leftJoin=`{
                    		"msProductOption":{
                    			"class":"msProductOption",
                    			"on":"msProductOption.key = 'color' AND msProductOption.product_id = msProduct.id"
                    		}
                    	}`
                      &showLog=`1`
                      &parents=`[[*id]]`
                      &tpl=`tpl.msProducts.row.Custom`
                      &where=`{"msProductOption.value":"черный"}`
                    ]]
разобрался извините за тему
Николай Загумённов
26 мая 2016, 11:31
1
0
В mFilter2 я попробовал так сортировать по количеству коментов, не знаю на сколько так правильно делать, вроде работает.
[[!mFilter2?
	&parents=`5,6,7,8`
	&class=`Ticket`
	&element=`getTickets`
	&sortAliases=`{ "ticket":"Ticket","vote":"TicketVote" }`
	&sort=`ticket|createdon:desc,vote:desc,comms|comments:desc`
	&limit=`6`
	&tpl=`tpl.Post.row`
	&includeTVs=`item_image`
	&showLog=`1`
	&leftJoin=`{
				"Comms": {
					"class": "TicketThread",
					"on": "Ticket.id = Comms.resource"
				}
			}`
	&select=`{
				"Ticket": "*",
				"Comms": "Comms.comments as comms"
			}`
	&groupby=`Ticket.id`
]]