Сергей Шлоков

Сергей Шлоков

С нами с 31 января 2013; Место в рейтинге пользователей: #3
Василий Наумкин
23 марта 2015, 06:40
4
+1
Вот за что люблю SEO, так это за привычку утверждать без доказательств. Поэтому, сначала вопросы.

1. Я не смог найти способ проверить наличие дублей, вообще. Все статьи в интернете больше походят на набор бабушкиных сплетен «зайдите в гугл, поищите так, а потом на яндекс, поищите эдак — видите, у вас разные результаты, значит у вас там где-то дубли!».

2. Если на сайте есть страницы, которые Яндекс исключил из поиска, наверное — он должен где-то их показывать? Не вижу


3. Откуда вообще могут взяться дубли по url, если этих url нигде нет? Ссылки на сайте выводятся как надо, в sitemap.xml — тоже. Яндекс сам при индексировании будет убирать слэш у контейнеров, что ли?

Ну а теперь ответы.

Friendly urls — это команды движку открыть какую-то страницу не по номеру, а по имени. Имя отправляется на запрос в index.php и он уже думает, какую страницу отдать. Так что, Apache2 и Nginx здесь сразу не при чём, работать нужно с движком сайта.

Для примера я набросал простой плагин, который сравнивает запрошенный адрес с каноническим для страницы, и если они не совпадают — делает 301 редирект.
<?php
if ($modx->event->name != 'OnLoadWebDocument') {return;}

$uri = $modx->resource->get('uri');
$request = ltrim(urldecode($_SERVER['REQUEST_URI']), '/');
if (strpos($request, '?') !== false) {
	list($request, $params) = explode('?', $request);
}
else {
	$params = '';
}

if (!empty($request) && mb_strtolower($request, 'UTF-8') != mb_strtolower($uri, 'UTF-8')) {
	if (!empty($params)) {
		$uri .= '?' . $params;
	}
	$modx->sendRedirect($uri, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
Конечно, его нужно внимательно тестировать, но общее направление работ понятно.
Илья Уткин
21 марта 2015, 14:00
1
+1
Да, как-то так:
Андрей Сухомозгий
17 марта 2015, 12:59
2
0
по шагам писать не буду. обычная работа с куками…
на одном сайте делал так:
Подключал библиотеку.
Вешал событие на клик по кнопке закрытия блока.
Когда пользователь кликает — в куки уходит запись и в течение 2 дней (или пока не почистит куки) пользователь не видит этого блока.
Мне этого было достаточно…
$(document).ready(function() {
        $('.alert-dismissable').each(function(index){
            if ($.cookie($(this).attr('class').split(/\s+/)[3])) {
                $(this).css('display','none');
              }
        });
        $('.close').click(function(){
            $.cookie($(this).parent().attr('class').split(/\s+/)[3], true, {  
                expires: 2,
                path: '/'
          }); 
        });
    })
Василий Наумкин
04 марта 2015, 13:57
3
+2
Сделать это с помощью aggregates и composites в схеме моего кастомного объекта не получилось (собственно, добавление в схему связи с нативным modx-объектом ни к чему не привело — связи не появилось).
Вот здесь ты просто где-то ошибся.

К своему объекту можно привязать что угодно — для того и нужны aggregates и composites. Например, вот связь сервиса HybridAuth с юзером. Вот она же, но уже в самом классе.

А вот связать объект MODX со своим чуть сложнее, нужно проявить фантазию. Мне нравится делать это при загрузке metadata своей модели.
Cyrax_02
15 января 2015, 11:39
1
0
Но вот как получить ТВ по событию OnBeforeDocFormSave (кроме предложенного выше решения)?

В OnBeforeDocFormSave новые (сохраняемые) значения TV можно получить следующими способами:
1) Из массива $_POST (как указал Василий). Но этот вариант работает только при вызове коннекторов (сохранение ресурса в админке). Если процессор вызывается из собственного кода, то никаких параметров в запросе не будет.

2) Из массива data, который также передаётся плагину (не задокументирован). В этом массиве лежат все новые (сохраняемые) параметры — и стандартные, и ТВ. Ключ стандартного параметра = имени параметра, ключ ТВ = tvID.

В OnBeforeDocFormSave старые (исходные) значения TV можно получить методом getTVValue (извлекает данные непосредственно из БД).

Самый корректный вариант, имхо, — это OnBeforeDocFormSave + массив data + getTVValue.
Evgeny Epifanov
07 мая 2014, 18:21
1
+1
Василий, спасибо тебе большое!
От себя добавлю: sendRedirect — по умолчанию делает 302 редирект, для 301
$modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
Василий Наумкин
28 января 2014, 14:18
4
0
Я выставляю пользователю переменную в поле extended профиля, а потом проверяю её при загрузке им страницы.

Если есть — перезагружаю его права.
$extended = $modx->user->Profile->get('extended')) {
if (!empty($extended['updateGroups'])) {
	unset($_SESSION['modx.user.'.$modx->user->id.'.userGroupNames']);
	$extended['updateGroups'] = 0;
	$modx->user->Profile->set('extended', $extended);
	$modx->user->Profile->save();
	
	$ctxQuery = $modx->newQuery('modContext');
	$ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
	if ($ctxQuery->prepare() && $ctxQuery->stmt->execute()) {
		if ($contexts = $ctxQuery->stmt->fetchAll(PDO::FETCH_COLUMN)) {
			$serialized = serialize($contexts);
			$modx->exec("UPDATE {$modx->getTableName('modUser')} SET {$modx->escape('session_stale')} = {$modx->quote($serialized)}");
		}
	}
}