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

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

С нами с 01 июля 2013; Место в рейтинге пользователей: #27
Максим Кузнецов
04 февраля 2015, 10:31
0
Я и не предлагал поменять магазин — этот модуль импорта из CSV, XML, XLS, XLSX универсален для всех ресурсов modx'a.
Просто необходимо отредактировать код так, чтобы при импорте создавался/обновлялся товар, а не документ (параметр class_key и, возможно, что-то еще по мелочам — можно сравнить с импортом в minishop из того же csv).

Не за что.)
Максим Кузнецов
04 февраля 2015, 10:11
1
0
Ммм…

Тогда предложу 2 варианта:

1. немного допилить этот вариант — modx-shopkeeper.ru/download/paid-extras/import-eksport2.html
2. Ждать и посматривать на эту тему
(вариант из разряда «сделать самому», думаю, описывать не требуется :) )
Максим Кузнецов
04 февраля 2015, 10:07
0
Чтобы товар находился в двух категориях — нужно использовать мультикатегории.

Насколько я знаю, подобным импортом такое не реализовать (ну или создать отдельную «скрытую» папку или контекст, куда выгружать вообще все товары и им подключать необходимые мультикатегории).
Максим Кузнецов
03 февраля 2015, 22:15
0
По поводу порядка загрузки изображений — вроде как, все уже придумано:
— грузить выбранные изображения в папку «0» (в выбранном источнике файлов), после чего при сохранении/создания ресурса, после присвоения ему Id — менять название папки и прописывать соответствующие записи в базу.

Альтернатив, насколько я знаю — нет (из-за этой специфики и ms/ms2gallery становится доступна в административной части только после создания ресурса). Готовых решений тоже.
Максим Кузнецов
03 февраля 2015, 22:11
0
1. Вы можете отключить jevix через административную часть добавления тикетов (но нежелательно, т.к. jevix — крайне полезная утилита)
2. Вы можете зайти в Наборы параметров (админка — в шестеренке) — и дописать необходимые теги и допустимые параметры.
Максим Кузнецов
03 февраля 2015, 11:08
1
0
Отлично, значит результат есть.

Теперь, если дату необходимо представить с возможностями «тикетов» — (сегодня/вчера, 5 минут назад) и так далее, то вам необходимо поставить дополнение DateAgo modstore.pro/packages/utilities/dateago и вызывать в нужном месте таким:
[[!dateAgo? &input=`[[+pub_date:default=`[[+publishedon]]`]]`]]
или таким образом:
[[+pub_date:default=`[[+publishedon:dateAgo]]`:dateAgo]]

Если же такой необходимости нет, то преобразовать текущий результат (unix timestamp) в обычную дату можно следующим образом:

[[+pub_date:default=`[[+publishedon:strtotime:date=`%a %b %e, %Y`]`:strtotime:date=`%a %b %e, %Y`]]
(возможно, без последнего ":strtotime:date=`%a %b %e, %Y`", но точно не скажу).

Формат даты, соответственно, настраивается по желанию (вот перечень доступных).
Максим Кузнецов
03 февраля 2015, 10:38
0
[[+pub_date:default=`[[+publishedon]]`]]
— так выводится что-нибудь (в чанке). (возможно, у вас не +, а * в вызове, если чанк вызывается в шаблоне самой новости)
Максим Кузнецов
03 февраля 2015, 10:15
0
modstore.pro/packages/users/office — это не для рекламы дополнения, а для прилагаемой к ней статье и «неверном» назначении прав по-умолчанию в modx'е. Там же и про ошибку замену 404 на аксесс дениед.

В крайнем случае, можно сделать самописный сниппет:

Сниппет getAccess
<?php
	$user = (!empty($userId)) ? $modx->getObject('modUser', $userId) : $modx->user;

	if (is_object($user) && $modx->user->isAuthenticated('web')) {
		$allowGroups = explode(",", $allowGroups);
		$userGroups = $user->getUserGroupNames();

		foreach($allowGroups as $check) {
			if(in_array($check, $userGroups)) {
				$accessComplete = 1;
				return $modx->getChunk($tpl);
			}
		}
		if($accessComplete != 1) {
			$url = $modx->makeUrl($redirectId);
			$modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
		}
	}
	else {
		$url = $modx->makeUrl($redirectId);
		$modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
	}

Вызов:
[[!getAccess? &allowGroups=`Administrator,Users` &tpl=`скрытый чанк` &redirectId=`айди_редиректа`]]
Максим Кузнецов
03 февраля 2015, 10:05
0
Звучит так, будто проблема с кэшированием.

А вообще, прожимается ли кнопка сохранить? Насколько помню, она там по умолчанию задизейблена.
Максим Кузнецов
03 февраля 2015, 09:01
0
Может, вызов даты вызывается кэшируемым, в результате чего дата берется из кэша?

[[Кэшируемый-сниппет]]
[[!Некэшируемый-сниппет]]
Максим Кузнецов
03 февраля 2015, 08:32
0
Сортировка идет по publishedon или createdon? Кэшированный вызов?
Вообще, хорошо бы приложить чанк/сниппет вызова.

В крайнем случае, в чанке для отображения нужной даты можно оформить вызов как
[[!dateAgo? &input=`[[*publishedon]]`]]
Максим Кузнецов
02 февраля 2015, 21:01
+2
Не поймите меня не правильно, пишу не критики ради, а предложения для.

Так как сумма сама по себе, отдельно от сроков, довольно внушительная, а разработчики (лично для меня), кроме Льва Вербицкого не слишком известные и, так как, все-таки, это не сам автор дополнения, возможно, многие из увидевших новость получат предпосылки предположить, что с полученной суммой все потенциально может и заглохнуть. Поэтому:

а) стоит собирать суммы поэтапно
б) ~каждый месяц выводить превью сделанного функционала
в) чуть больше данных предоставить о итоговой компании разработчиков (знаю, это, по-сути, софистика, но может повысить уровень доверия)
г) (возможно) отображать результаты в превью здесь — minishop2.com/, все равно сайт висит мертвым грузом, а хороший пример поможет успешному привлечению пользователей. Там же организовать нормальную структурированную документацию (или на docs.modx).

А по теме — готов вложить 5-10к, жду реквизитов сбербанка.)
Максим Кузнецов
02 февраля 2015, 12:44
0
[[#[[+resource_id]].parent:isequalto=`50`:then=`
..wat…

[[+resouce_id]] == [[+id]] / [[*id]]?
[[+resource_id]].parent == [[+parent]] / [[*parent]]?
isequalto == is
Максим Кузнецов
02 февраля 2015, 09:31
+1
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
— склейка для www. С [OR] не сталкивался, но дописать можно по аналогии.
Максим Кузнецов
31 января 2015, 22:00
0
Ммм… давайте я вам для примера приведу свою регистрацию на этом же сниппете со схожими полями и проверкой рекаптчей — если не будет работать, то проблема со стороны хостинга/чего-то еще, вряд ли зависящего от вас.

Вызов в шаблоне:
[[!Register?
	&preHooks=`recaptcha`
	&submitVar=`register-btn`
	&activationResourceId=`айди_страницы_активации`
	&activationEmailTpl=`Email.Activation`
	&activationEmailSubject=`Регистрация на сайте (название сайта)`
	&placeholderPrefix=`reg.`
	&successMsg=`<div class="alert alert-success">Спасибо за регистрацию. На вашу электронную почту <b>[[!+reg.email]]</b> отправлено письмо со ссылкой на активацию аккаунта. Пройдите по этой ссылке, чтобы завершить регистрацию. </div>`
	&usergroupsField=`reg_type`
	&customValidators=`validat`
	&validate=`nospam:blank,
	reg_type:valueIn=^Users^,
		username:required:minLength=^2^:maxLength=^16^,
		password:required:minLength=^6^:maxLength=^16^,
		password_confirm:password_confirm=^password^,
		email:required:email`
]]

[[!+error.message:default=`[[$register.Form]]`]]`]]

Чанк с формой регистрации register.Form:
<form action="[[~[[*id]]]]" method="POST" class="authFullForm" id="iWannaRegister">
	<div>
		<input name="username" value="[[!+reg.username]]" class="roundInput" type="text" placeholder="Никнейм">
		[[!+reg.error.username:notempty=`
		<div class="alert alert-danger">[[!+reg.error.username]]</div>
		`:empty=`
		<span>- буквы и цифры, от 2 до 16 символов.</span>
		`]]
	</div>
	<div>
		<input name="email" value="[[!+reg.email]]" class="roundInput" type="text" placeholder="E-Mail">
		[[!+reg.error.email:notempty=`
		<div class="alert alert-danger">[[!+reg.error.email]]</div>
		`:empty=`
		<span>- необходим для авторизации. Никакого спама не рассылаем. Честно!</span>
		`]]
	</div>
	<div>
		<input name="password" class="roundInput" type="password" placeholder="Введите пароль">
		[[!+reg.error.password:notempty=`
		<div class="alert alert-danger">[[!+reg.error.password]]</div>
		`:empty=`
		<span>- от 6 до 16 символов.</span>
		`]]
	</div>
	<div>
		<input name="password_confirm" class="roundInput" type="password" placeholder="Повторите пароль">
		[[!+reg.error.password_confirm:notempty=`
		<div class="alert alert-danger">[[!+reg.error.password_confirm]]</div>
		`:empty=``]]
	</div>
	<div>
		[[!+reg.recaptcha_html]]
		[[!+reg.error.recaptcha]]
	</div>
	<div>
		<input type="hidden" name="nospam" value="[[!+reg.nospam]]">
		<input type="hidden" name="reg_type" value="Users">
		<input class="defaultButton-G" name="register-btn" type="submit" value="Зарегистрироваться">
	</div>
</form>
Максим Кузнецов
31 января 2015, 21:35
5
+3
Помогу с решением.

Вызываем сниппет Login:
[[!Login? &loginTpl=`fastLoginTpl` &errTpl=`fastLoginError`]]

Чанк формы для авторизации fastLoginTpl:
<div style="display: none;" id="authErrors">[[+errors]]</div>
<form class="loginForm" id="iWannaLogin" action="[[~[[*id]]]]" method="post">
	<div class="login">
		<input id="loginForm" name="username" class="roundInput" type="text" placeholder="Логин" title="Ваш логин">
	</div>
	<div class="password">
		<input id="passwordForm" name="password" class="roundInput" type="password" placeholder="Пароль" title="Ваш пароль">
	</div>
	
	<input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />
	<input class="loginLoginValue" type="hidden" name="service" value="login" />
	
	<div class="submit">
		<a rel="nofollow" href="[[~17]]">Я - тупой, забыл пароль..</a>
		<input id="ajaxLoginButton" type="submit" name="Login" value="Войти" />
	</div>
</form>

Чанк для вывода ошибки fastLoginError:
[[+msg]]

Скрипт js, обрабатывающий событие отправки формы (нужен подключенный jquery):
<script type="text/javascript">
	$(document).ready(function(){
		$("#iWannaLogin").bind("submit", function() {

			$("#authErrors").text("");
		
			//здесь можно допилить подсветку полей с ошибкой
			if ($("#loginForm").val().length < 1 && $("#passwordForm").val().length < 1) {
				$.jGrowl("Введите логин и пароль", {group: "m-Error"});
				return false;
			}
			if ($("#loginForm").val().length < 1) {
				$.jGrowl("Введите логин", {group: "m-Error"});
				return false;
			}
			if ($("#passwordForm").val().length < 1) {
				$.jGrowl("Введите пароль", {group: "m-Error"});
				return false;
			}

			$.ajax({
				type: "POST",
				cache: false,
					url: "[[~[[*id]]]]",
				data: $(this).serializeArray(),
				beforeSend: function(){
					$("#ajaxAuth .closeBlock").css("display", "none");
					$("#ajaxAuth .ajaxLoad").css("display", "block");
					
					$("#ajaxLoginButton").prop("disabled", true);
				},

				success: function(data) {
					$("#ajaxAuth .closeBlock").css("display", "block");
					$("#ajaxAuth .ajaxLoad").css("display", "none");
			
					var errMessage = $(data).find("#authErrors").text();
				
					if(errMessage == ""){
						window.location = "адрес для переадресации при успешной авторизации";
					}
					else{
						$("#authErrors").text(errMessage);
						$.jGrowl($("#authErrors").text(), {group: "m-Error"});
					}
				},
				
				complete: function(){
					$("#ajaxLoginButton").prop("disabled", false);
				}
			});
			return false;
	
		});
	});
</script>

— я еще подключил плагин jgrowl для отправления алертов. В его же вызове group: «m-Error» — класс для всплывающего бокса (красный, с ошибкой).
Если jgrowl не нужен — то вместо него вставляем в поле для ошибок желаемый ответ. Пример:
$("#authErrors").text("текст ошибки").css("display", "block");

#ajaxAuth .ajaxLoad — в моем примере форма с индикатором загрузки, которая появляется при обработке аякс-запроса.
Максим Кузнецов
31 января 2015, 21:27
+1
здесь нет js, если это register — там просто идет post-отправка.

[[!Register
— после него должен быть знак вопроса.

Вот так:

[[!Register?
	...
]]
Исправьте, должно заработать.