Евгений Шеронов

Евгений Шеронов

С нами с 20 мая 2015; Место в рейтинге пользователей: #30
Максим Кузнецов
10 января 2015, 09:34
4
+2
С вашего позволения, приведу сюда пример реализации большинства пунктов (не отрицаю востребованнось решения данных задач сразу из коробки, т.к. работы для реализации этих пунктов нужно сделать прилично):

Страницы пользователей с нормальными урл

1. Создаем страницу «профиль пользователя» (не путаем с личным кабинетом), выставляем ему псевдоним, допустим users, к которой будут обращаться в виде site.ru/users?profile=имя

2. Ставим дополнение pdoTools

3. Создаем сниппет user.Profile и добавляем его в шаблон вывода
<?php
	$count = $modx->getCount('modUser', array('username' => $_GET[profile]));
	if($count <= 0){
		echo'	<h2>
				<a>Ошибка</a>
			</h2>
			<div>
				Пользователя не существует.
			</div>';
	}
	else {
		$params = array();
		$params['users'] = $_GET[profile];
		$params['showBlocked'] = '1';
		$params['tpl'] = 'user.Profile';
		$params['prepareSnippet'] = 'user.Profile.Prepare';
		
		$result = $modx->runSnippet('pdoUsers', $params);
		
		if (!empty($result)) {
			return $result;
		}
		else {
			return '<h2>
					<a>Ошибка</a>
				</h2>
				<div>
					Что-то сломалось.. Сейчас починим.
				</div>';
		}

	}
— насколько я помню, сразу вызвать pdoUsers с параметром конкретного пользователя нежелательно, т.к. если пользователя не существует, он выдает по-умолчанию весь список пользователей. Возможно, сейчас что-то поменялось или это можно обойти — не проверял.

Для данного сниппета также можно дописывать условия, если пользователь не активирован и тд и тп. При помощи параметров tpl и prepareSnippet кастомизируем до нужного уровня.

4. Дописываем в .htaccess
RewriteRule ^users/([^/]+)$ /users?profile=$1 [L]
— чтобы ссылка приняла вид site.ru/users/Имя_пользователя

Возможность добавлять поля в профиль пользователя

При регистрации: дополнение login
Для редактирования пользователем (личный кабинет) — дополнение office

Возможность указывать шаблон для оформления страницы пользователя

1. Добавляем дополнительное поле в личный кабинет пользователя (шаблон отображения)
2. В шаблоне отображения профиля пользователя дописываем классы, завязанные на полученном значении (class=«userInfo-[[+tpl.style]]»)
2.А. Если необходимо менять структуру шаблона в зависимости от выбранного пользователя значением, то в сниппете в первой части дописываем до

$params = array();
получение extended-поля по id пользователя с вытекающими условиями if, внутри которых будет разный параметр $params['tpl']

Добавить «из коробки» дату регистрации и дату последней активности

Дату регистрации — сниппет логин и 1 доп. поле.
С датой последней активности сложнее, т.к. в таблицах Modx'a, насколько я помню, есть только поле последней авторизации. Возможно, нужно завязывать на сессии +временной промежуток.

Возможность сделать станицу пользователя общедоступной для просмотра

Аналогично пункту 2.А. в разделе «шаблона отображения»
Максим Кузнецов
04 октября 2014, 12:35
1
+1
Если своим сниппетом через pdoUsers, то примерно так:

Сниппет user.Profile
<?php
	$count = $modx->getCount('modUser', array('username' => $_GET[profile]));
	if($count <= 0){
		echo'	<h2 class="contentTitle">
					<a>Ошибка</a>
				</h2>
				<div class="content">
					Пользователя не существует.
				</div>';
	}
	else {
		$params = array();
		$params['users'] = $_GET[profile];
		$params['showBlocked'] = '1';
		$params['tpl'] = 'user.Profile';
		$params['prepareSnippet'] = 'user.Profile.prepare';
		
		$result = $modx->runSnippet('pdoUsers', $params);
		
		if (!empty($result)) {
			echo $result;
		}
		else {
			echo'	<h2 class="contentTitle">
						<a>Ошибка</a>
					</h2>
					<div class="content">
						Что-то сломалось..
					</div>';
		}

	}

+ user.Profile.prepare, где преобразовываешь нужные поля до культурного вида, в духе:
<?php
	if ($row['gender'] == '1') {
		$row['gender'] = 'Парень';
	}
	elseif ($row['gender'] == '2') {
		$row['gender'] = 'Девушка';
	}
	elseif ($row['gender'] == '0')
		$gender ='';


	if (!empty($row['fullname']))
		$row['fullname'] = 'Имя: <b>' . $row['fullname'] . '</b>

';

	if (!empty($row['gender']))
		$row['gender'] = 'Пол: <b class="' . $gender . '">' . $row['gender'] . '</b>
';
		

	if (!empty($row['city']))
		$row['city'] = 'Город: <b>' . $row['city'] . '</b>
';
		
		
	if ($row['blocked'] != '0' && $row['blockeduntil'] == '0')
		$row['blocked'] = '
Заблокирован
';
	else $row['blocked'] = '';
		
	if ($row['blockeduntil'] != '0')
		$row['blockeduntil'] = '
Заблокирован до:' . $row['blockeduntil'] . '
';
	else $row['blockeduntil'] = '';
		
	return serialize($row);


+ чанк user.Profile, где формируешь шаблон профиля

Ну и в .htaccess добавить правило в духе:
RewriteRule ^users/([^/]+)$ /users?profile=$1 [L]

— чтобы ссылка была вида не ?profile=.., а /users/Username
Василий Наумкин
01 октября 2014, 08:46
3
+1
[[!pdoResources?
	&class=`msProductFile`
	&where=`{"product_id":10, "parent":0}`
	&sortby=`id`
	&sortdir=`asc`
]]
parent = 0 — это выборка именно большой картинки, потому что у превьюшек parent всегда не 0, а id существующей картинки. Ну а product_id понятно что — id нужного товара.

Друзья, осваивайте уже pdoTools.
Артур Цыба
25 февраля 2014, 21:19
1
0
github.com/tanaevr/miniMs2Order вот решение от разработчика: нужно прикрепить на страницу script.js, создать сниппет и постаить рядом с выводом miniShop. У сниппета есть параметр &limit, это кол-во видимых товаров.
Виталий Валерьевич
10 февраля 2014, 14:49
4
0
Делается очень просто, опишу алгоритм и набросаю от руки, поднимать наработки долго.

Алгоритм:

  1. Получить реферара
  2. Определить поисковую систему
  3. Получить поисковый запрос или ссылку переход с которой был осуществлен
  4. Записать в cookie или в сессию результат
  5. В нужном месте собрать

Пишем сниппет:

$referer = $_SERVER['HTTP_REFERER'];
setcookie('referer', $referer, mktime(0, 0, 0, 1, 1, 2015));
	
if (stristr($referer, 'yandex.ru')) { 
	$search = 'text='; $crawler = 'Yandex'; 
}
else if (stristr($referer, 'rambler.ru')) { 
	$search = 'words='; $crawler = 'Rambler'; 
}
else if (stristr($referer, 'google.ru')) { 
	$search = 'q='; $crawler = 'Google'; 
}
else if (stristr($referer, 'google.com')) { 
	$search = 'q='; $crawler = 'Google'; 
}
else if (stristr($referer, 'mail.ru')) { 
	$search = 'q='; $crawler = 'Mail.Ru'; 
}
else if (stristr($referer, 'bing.com')) { 
	$search = 'q='; $crawler = 'Bing'; 
}
else if (stristr($referer, 'qip.ru')) { 
	$search = 'query='; $crawler = 'QIP'; 
}
	
if (isset($crawler)) {
	$phrase = urldecode($referer);
	preg_match('/'.$search.'([^&]*)/', $phrase.'&', $phrase2);
	$phrase = $phrase2[1];
}

setcookie('phrase', $phrase, mktime(0, 0, 0, 1, 1, 2015));

Запускаем в шаблоне, перед <!DOCTYPE>, далее если используется Formit, создаем сниппет-hook и записываем в него следующую конструкцию (как пример):

$output = '';

foreach ($_COOKIE as $k => $v) {
	if (0 === strpos($k, 'utm')) $output .=  "$k: $v \n";
}

$hook->setValue('referer', $output);
return true;

Итог: получаем плейсхолдер [[+referer]], который содержит всю необходимую информацию по рефереру. Код от руки, естественно требует доработок, но вроде нигде не ошибся.
Василий Наумкин
13 июля 2013, 18:02
2
0
if (empty($parent)) {$parent = $modx->resource->id;}

$pids = array_merge(array($parent), $modx->getChildIds($parent));
$ids = array();

$q = $modx->newQuery('msProduct');
$q->where(array('class_key' => 'msProduct','parent:IN' => $pids,'published' => 1,'deleted' => 0));
$q->select('`msProduct`.`id`');
if ($q->prepare() && $q->stmt->execute()) {
	$ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
}

$q = $modx->newQuery('msProduct');
$q->leftJoin('msCategoryMember', 'msCategoryMember', '`msCategoryMember`.`product_id` = `msProduct`.`id`');
$q->where(array('class_key' => 'msProduct','msCategoryMember.category_id:IN' => $pids,'published' => 1,'deleted' => 0));
$q->select('`msProduct`.`id`');
if ($q->prepare() && $q->stmt->execute()) {
	$ids2 = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
	if (!empty($ids2)) {
		$ids = array_unique(array_merge($ids, $ids2));
	}
}

return count($ids);
Владимир
02 июня 2013, 11:30
1
0
попробовал babel прикрутить к minishop вроде получилось. чтоб каждому товару не загружать одинаковые картинки написал сниппет небольшой. Берет id документа, получает alias, затем по alias ищет id в главном контексте и выводит фото товара. Подскажите правильно это?
$res = $modx->getObject('modResource',array('id' => $id));
$alias = $res->get('alias');
$resources = $modx->getCollection('modResource', array(
'alias' => $alias,
'context_key' => 'web'
));
foreach ($resources as $resource) {
return($resource->get('id'));
break;
}
посмотреть можно тут testvgrish.tmweb.ru/
Василий Наумкин
09 января 2013, 08:29
1
0
Если сломалось сразу и везде — проблема системная. Php не обновлял, настройки не менял?

Алгоритм починки:
1. Смотрим ошибки загрузки в /var/log/nginx/имясайта-error.log
2. Проверяем наличие директорий /var/www/имясайта/tmp/ — именно туда грузятся файлы, сначала.
3. Проверяем конфиги сайтов в /etc/nginx/sites-enabled/имясайта.pool, особенно смотрим на строчки про upload и tmp.

Не помешает также запустить скрипт, восстанавливающий верные права на файлы и директории сайта, 0777 — это не хорошо.
#!/bin/bash

USER="имяюзерасайта"
GROUP="имягруппысайта"

chown -R $USER:$GROUP "/var/www/test/www";
find "/var/www/test/www" -type d -exec chmod 0755 '{}' \;
find "/var/www/test/www" -type f -exec chmod 0644 '{}' \;

Если всё сделано по моей инструкции, то имя юзера и группы совпадают друг с другом, а также, с именем директории сайта.
Василий Наумкин
08 сентября 2012, 06:59
1
0
Файлы и деректории должны принадлежать юзеру, от имени которого запускается php для этого сайта.

Тогда — 755 и 644.

Если же у вас, например, все принадлежит юзеру ftp, а php работает от www-data, то надо или сменить владельца для файлов, или выставлять 777.

Почиатйет про права тут — это интересно system-administrators.info/?p=1087