Максим Кузнецов

Максим Кузнецов

С нами с 01 июля 2013; Место в рейтинге пользователей: #27
Максим Кузнецов
18 мая 2017, 16:47
+4
Всегда забавляли такие тз..)

Сайт должен обеспечивать корректное отображение данных во всех современных интернет браузерах, в том числе:
— Internet Explorer (5.5 и выше)
Максим Кузнецов
18 мая 2017, 14:25
0
Skype: justbekami

Ну и пример оптимизированного проекта.
Максим Кузнецов
18 мая 2017, 03:14
+2
Можно сделать вот так:

После
$chunks = explode('/', $request);

Прописываем:
if (end($chunks) == '') {
	array_pop($chunks);
}

//Проверяем, что есть минимум 2 части ссылки (/users/ и /username/)
if (count($chunks) >= 2) {
	switch ($chunks) {
			
		//Cама страница пользователей
		case 'users':
			//проверяем существование пользователя
			if (!empty($chunks[1]) && $modx->getCount('modUser', array('username' => $chunks[1]))) {
				$user = $modx->getObject('modUser', array('username' => $chunks[1]));

				if ($user && $user->get('active') == 1) {
					$user_name = $user->get('username');
						
					//Приводим юзернейм к правильному регистру
					if ($chunks[1] != $user_name) {
						$chunks[1] = $user_name;
						$modx->sendRedirect(implode('/', $chunks));
					}
					
					//выставляем плейсхолдеры	
					$user_id = $user->get('id');
					$modx->setPlaceholder('user_id', $user_id);
					$modx->setPlaceholder('user_name', $user_name);
	
					//Страница профиля
					if (count($chunks) == 2) {
							
					}
					
					//Подразделы
					elseif (count($chunks) == 3) {
						switch ($chunks[2]) {
								
							//Сообщения пользователя
							case 'posts':
									
								break;
									
							//Комментарии пользователя
							case 'comments':
									
								break;
								
							//Избранное пользователя	
							case 'favorites':
									
								break;
						}
					}
						
					$modx->sendForward(айди_страницы_users);
				}

			}
					
			break;
				
		
	}
}
	
//иначе редиректим

— в местах, где определяется «вкладка» дописать необходимые плейсхолдеры по вкусу и готово.

Если что-то не получится — могу выслать куда-нибудь готовый код плагина.
Максим Кузнецов
17 мая 2017, 00:35
0
Доброй ночи.
Сроки: 5 дней, ценник: 20к.
Максим Кузнецов
15 мая 2017, 08:54
+1
поменять pageLinkScheme или выставить / перед [[+href]] в чанках пагинации.
Максим Кузнецов
14 мая 2017, 11:40
+2
При подгрузке кнопкой/скроллом пагинация по прежнему присутствует, только с параметром display: none.
Вы можете изменить это через модификацию pdoPage.js или при помощи css через display: block !important.

А вообще, для поисковиков в должно хватать и sitemap'a.
Максим Кузнецов
13 мая 2017, 10:52
+2
Специально на этот случай в Office предусмотрена возможность расширения классов:

1. Идем в директорию core/components/office/controllers/ и создаем там свой класс.
Например, customauth.class.php
2. Расширяем в нем стандартный класс авторизации
<?php
	if(!class_exists('officeAuthController')) {
		require_once 'auth.class.php';
	}

	class officeCustomAuthController extends officeAuthController {
		//здесь будут расширяемые функции
	}
	
	return 'officeCustomAuthController';
3. Идем в core/components/office/controllers/auth.class.php и ищем в нем дефолтную функцию, которую хотим модифицировать. В вашем случае это formLogin. Копируем её.
4. Вставляем в отмеченном месте из шага 2 данную функцию.
5. Заменяем желаемый участок кода
6. Идем в вызываемый чанк нужной формы Office и меняем там auth/formLogin на наш customauth/formLogin

Готово.
Максим Кузнецов
24 апреля 2017, 19:11
0
Подскажите, пожалуйста, удалось найти решение проблемы (mFilter2 + msProducts)?
Максим Кузнецов
21 апреля 2017, 18:29
-1
Вероятно, какой-то баг с подсчетом/отображением общего количества дополнений:

Максим Кузнецов
15 апреля 2017, 22:16
+1
1. Отключаете родной плагин MobileDetect
2. Реализуете на его основе модификатор
3. Прописываете с ним необходимые условия
Максим Кузнецов
10 апреля 2017, 08:29
2
+3
Не нужно 2 раза вызывать один и тот же сниппет:

{set $result = $_modx->runSnippet('!pdoResources', [
	'parents' => id родителя
])}

{if $result | length > 0}
	{$result}
{else}
	//если вывода нет
{/if}
Максим Кузнецов
09 апреля 2017, 18:49
0
Неужели никто не знает о параметре loadModels ?..)
Максим Кузнецов
09 апреля 2017, 13:08
3
+2
Вообще, для сео это совсем не критично, т.к:
— если вам необходимо добавить страницы пользователей в sitemap, то это можно сделать в рамках pdoUsers
— если вам необходимы динамичные заголовки и мета-теги, то можно сделать примерно так:

1. В плагине создаем плейсхолдер user_id

2. В мета-тегах проверяем его наличие:
{block 'meta'}
	{var $user_id = $_modx->getPlaceholder('user_id')} 

	{if $user_id | length > 0}
		{var $user_name = $_modx->getPlaceholder('user_name')}
		{var $pagetitle = $user_name ~ ' / Профиль пользователя'}
	
		<title>{$pagetitle ~' :: '~ $_modx->config.site_name}</title>
		...
	{else}
		{parent}
		//обычный набор мета-тегов
	{/if}
{/block}
— надеюсь логика понятна..)

Что же до примера со вторым вариантом, то примерно вот так:

1. Создание страницы пользователя (тикетом)
<?php
	if ($modx->event->name == 'OnUserActivate') {
		if ($user) {
			if ($profile = $user->getOne('Profile')) {
				$user_id = $user->get('id');
				$fullname = $profile->get('fullname');

				/* Можно распределять пользователей в зависимости от их группы */
				if ($user->isMember('Users')) {
					//указываем родителя и шаблон
					$parent = 21;
					$template = 28;
				}
	
				if (isset($parent)) {	
					//Дополнительно может потребоваться проверка на то, создана ли уже страница для пользователя 
					//(на случай, если у вас возможна повторная активация-деактивация пользотвалея 
					$page = $modx->getObject('modResource', array(
						'parent' => $parent,
						'createdby' => $user_id
					));
		
					if (!$page) {
						/* Формируем uri по айди пользователя */
						$parent_alias = $modx->getObject('modDocument', $parent)->get('alias');
						$parent_alias .= '/' . $user_id;
					
						$ticket = $modx->newObject('modDocument');
					
						$ticket->set('parent', $parent);
						$ticket->set('template', $template);
						$ticket->set('class_key', 'Ticket');
						$ticket->set('show_in_tree', 0);
						$ticket->set('published', 1);
						$ticket->set('author', $user_id);
						$ticket->set('createdby', $user_id);
						$ticket->set('pagetitle', $fullname);
						$ticket->set('uri_override', 1);
						$ticket->set('uri', $parent_alias);
						$ticket->set('alias', $user_id);

						$ticket->save();
					}
				}
			}
		}
	}

2. Синхронизируем данные (в одну сторону — от пользователя к странице). Соответственно, если есть потребность редактировать поля пользователя из админки через его страницу, потребуется еще один плагин.
<?php
	if ($modx->event->name == 'OnUserFormSave' && $mode != 'new') {
		if ($user) {
			if ($profile = $user->getOne('Profile')) {
				$user_id = $user->get('id');

				if ($user->isMember('Users')) {
					$parent = 21;
				}
				
				if (isset($parent)) {
					//Ищем страницу пользователя
					$page = $modx->getObject('modResource', array(
						'parent' => $parent,
						'createdby' => $user_id
					));
					
					if ($page) {
						$extended = $profile->get('extended');
						
						//Обновляем дефолтное поле страницы
						$page->set('pagetitle', $profile->get('fullname'));
						
						//Обновляем тв-поле
						if (isset($extended['phone'])) {
							$page->setTVValue('user_phone', $extended['phone']);
						}

						//Дополнить требуемыми полями по вкусу %)
					
						$page->save();
					}
				}
			}
		}
	}
Максим Кузнецов
03 апреля 2017, 20:41
0
Если у вас используется источник файлов для tv — в настройках тв-поля, в закладке «Источники файлов» необходимо дополнительно указать источник для свежесозданного контекста.
Максим Кузнецов
31 марта 2017, 14:20
0
Видимо, появилась какая-то ошибка со скриптами или подключением jQuery.
Ну и еще есть вариант, что что-то с настройками smtp/хостингом.
Максим Кузнецов
31 марта 2017, 13:42
+1
Именно..)
Если вам не нужно будет фильтровать акции по партнерам — для вас это оптимальный и наиболее удобный вариант.
Максим Кузнецов
31 марта 2017, 13:32
+1
MIGX

В первой колонке выбираете партнера (из того же тв-поля), во второй прописываете ссылку до их посадочной страницы.
Максим Кузнецов
31 марта 2017, 08:44
+2
UPD:
$data[] = "{$row['pagetitle']}=={$row['id']}";
Максим Кузнецов
31 марта 2017, 07:15
+1
Мм… а почему у вас при изменении контента убирается чекбокс?

Вообще, через чекбоксы такие списки лучше не выводить (партнеров ведь может быть много), поэтому уместнее было бы реализовать список партнеров в виде тв-типа «список ресурсов» или «список (множественный выбор)».

Во втором случае в возможных значениях необходимо указать:
@EVAL return $modx->runSnippet('snippet_name');

И создать новый сниппет, который будет возвращать результаты:
<?php
	$output = '';

	$q = $modx->newQuery('modResource');
	$q->where(array(
		"parent"    => "8"
	));
	$q->sortby('menuindex','ASC');

	$q->select(array(
		"modResource.id",
		"modResource.pagetitle",
	));

	$s = $q->prepare();
	$s->execute();

	while($row = $s->fetch(PDO::FETCH_ASSOC)){
		$data[] = "{$row['pagetitle']}=={$row['pagetitle']}";
	}

	$output = implode("||", $data);
	return $output;

В таком случае «привязка» партнеров будет происходить по их id, что позволит свободно изменять их остальные данные без опасения потерять выбранных парнетров.
Максим Кузнецов
31 марта 2017, 00:13
0
Проверил на дефолтной сборке — вызов выше работает корректно (если указан верный родитель и шаблон для результатов).

Нужно смотреть консоль ошибок вашего сайта в браузере и лог MODX'a.