Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Василий Наумкин
03 апреля 2015, 04:28
2
0
Видимо, речь об этом сниппете.

Тогда нужно его совсем чуть-чуть переделать:
<?php
// Получаем готовый текст
$text = trim($input);
if (empty($text)) {
	return;
}

// Стандартные чанки, можно переопределить
if (empty($tpl)) {$tpl = '@INLINE <li>[[+value]]</li>';}
if (empty($tplOuter)) {$tplOuter = '@INLINE <ul>[[+rows]]</ul>';}

// Подключаем pdoTools для работы с инлайновыми чанками
$pdo = $modx->getService('pdoTools');

// Разбиваем текст по символу переноса строки
$rows = '';
$tmp = array_map('trim', explode("\n", $text));
foreach ($tmp as $value) {
	if (empty($value)) {continue;}
	$rows .= $pdo->getChunk($tpl, array('value' => $value));
}

// Если есть, что выводить - выводим
if (!empty($rows)) {
	return $pdo->getChunk($tplOuter, array('rows' => $rows));
}

И можно вызывать в чанке оформления галереи:
[[+add:getAddList]]

Здесь сам сниппет ничего получать не должен, потому что, в отличии от ТВ, у картинок нет имён и они не так привязаны к ресурсам. Поэтому, работаем только с уже переданным текстом.
Дмитрий Кондаков
31 марта 2015, 12:33
1
+1
Создай сниппет tvValue:
<?php
$tv = $modx->getObject('modTemplateVar', array('name' => $name));
$elements = $tv->get('elements');
$element = explode('||', $elements);
$els = array();
foreach($element as $e) {
  list($elName,$elId) = explode("==", $e);
  $els[$elId] = $elName;
}
echo $els[$input];
И в чанке выводи tv так:
[[+square_from:tvValue]]
Григорий Коленько
26 марта 2015, 23:28
1
+1
Думаю, стоит попробовать так. Плохая практика записывать куда-либо в кириллице.
Код не проверял, но попробуй разобраться
<div>
	<ul>
		<li><a href="#" class="city_item" data-city="moscow" data-phone="8 800-400-34-34'">Москва</a></li>
		<li><a href="#" class="city_item"  data-city="ryazan" data-phone="8 800-400-34-34">Рязань</a></li>
	</ul>
</div>

<script type="text/javascript">
$(document).ready(function () {
    jQuery.preventDefaultEvent = function (e, options) {
        options = options || {shift: 1, ctrl: 1, alt: 1, meta: 1};
        var href = e.currentTarget.getAttribute('href');
        if (((options.shift && e.shiftKey)
            || (options.alt && e.altKey)
            || (options.ctrl && e.ctrlKey)
            || (options.meta && e.metaKey))
            && href && href.indexOf('#') != 0
            && href.indexOf('javascript:') != 0
        ) return true;
        e.preventDefault();
        return false;
    };
    $(function () {
        var city = $.cookie("city");
        var phone = $("[data-city=" + city + "]").data("phone");
        $('.phoneblock').text(phone);

    });

    $('body').on("click", ".city_item", function (e) {
        if ($.preventDefaultEvent(e)) return;
        $.cookie('city', $(this).data("city"));

        
           var phone = $(this).data("phone");
            $('.phoneblock').text(phone);
            $('.city').text($(this).text());
        

    });
});

</script>
Abu
Abu
24 марта 2015, 02:31
1
+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, 16:31
8
+1
Ну вот как-то так набросал на скорую руку. -)

Создал плагин, повесил на событие OnDocFormSave.

<?php
if ($modx->event->name == 'OnDocFormSave') {

	$parentIds = $modx->getParentIds($id, 4, array('context' => 'web'));   // Получаем id всех родителей ресурса
	$res = $modx->getObject('modResource',$id);
	$curAlias = $res->get('alias');   // Алиас текущего ресурса

	$cnt = count($parentIds);  // Количество родителей

	if($cnt > 2) { 

		$aliases = array();   // Массив для всех найденных алиасов

		foreach($parentIds as $v) {
			if($v == 22 || $v == 0) continue;  // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем.

			$obj = $modx->getObject('modResource', $v);
			$alias = $obj->get('alias');
			$aliases[] = $alias;
		}

		$resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias);

	} else {
		$resource->set('uri', $curAlias);
	}

	$resource->set('uri_override', true);
        $resource->save();

}
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.

if ($mode == 'new') {
    // код выше
}
Рустам С
21 марта 2015, 00:04
1
0
Нашел еще интересный плагин для роутинга контекстов

NEW CONTEXT ROUTING PLUGIN FOR MODX
chsmedien.com/blog/2014/01/new-context-routing-plugin-for-modx

(modx.com/extras/package/xrouting
Мордынский Николай
20 марта 2015, 17:32
5
+1
Вот нашел решение

// Try to find by email
$modx->event->_output = $modx->getObjectGraph('modUser', '{"Profile":{},"UserSettings":{}}', array ('Profile.email' => $scriptProperties['username']));
Сюда можно дописывать еще критерии поиска, можно хоть по дополнительным полям логиниться

Плагин вешается на событие onUserNotFound