Андрей

Андрей

С нами с 28 февраля 2013; Место в рейтинге пользователей: #139
Андрей
07 мая 2019, 09:05
2
+1
Я себе такой скрипт написал, просто запускаешь после установки модх через консоль

php modx_config.php

Часть с установкой пакетов взял из заметки Василия Наумкина.
Просто в массивах указываете нужные параметры и запускаете.
Не забываем указать логин и пароль администратора в конфигурации.

<?php

set_time_limit(0);
ini_set('max_execution_time', 0);

// API

require_once 'config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
$modx->getService('error','error.modError', '', '');

$cache = $modx->getCacheManager();

function installPackage($packageName, $provider = 1) {
	global $modx;

	$provider = $modx->getObject('transport.modTransportProvider', $provider);
	$provider->getClient();
	$modx->getVersionData();
	$productVersion = $modx->version['code_name'].'-'.$modx->version['full_version'];

	$response = $provider->request('package','GET',array(
		'supports' => $productVersion,
		'query' => $packageName
	));

	if (!empty($response)) {

		$foundPackages = simplexml_load_string($response->response);

		foreach($foundPackages as $foundPackage) {
			/* @var modTransportPackage $foundPackage */
			if($foundPackage->name == $packageName) {
				$sig = explode('-',$foundPackage->signature);
				$versionSignature = explode('.',$sig[1]);
				$url = $foundPackage->location;

				if (!download($url, $modx->getOption('core_path').'packages/'.$foundPackage->signature.'.transport.zip')) {
					return array(
						'success' => 0,
						'message' => 'Could not download package <b>'.$packageName.'</b>.',
					);
				}

				$package = $modx->newObject('transport.modTransportPackage');
				$package->set('signature',$foundPackage->signature);
				$package->fromArray(array(
					'created' => date('Y-m-d h:i:s'),
					'updated' => null,
					'state' => 1,
					'workspace' => 1,
					'provider' => $provider->id,
					'source' => $foundPackage->signature.'.transport.zip',
					'package_name' => $sig[0],
					'version_major' => $versionSignature[0],
					'version_minor' => !empty($versionSignature[1]) ? $versionSignature[1] : 0,
					'version_patch' => !empty($versionSignature[2]) ? $versionSignature[2] : 0,
				));

				if (!empty($sig[2])) {
					$r = preg_split('/([0-9]+)/',$sig[2],-1,PREG_SPLIT_DELIM_CAPTURE);

					if (is_array($r) && !empty($r)) {
						$package->set('release',$r[0]);
						$package->set('release_index',(isset($r[1]) ? $r[1] : '0'));
					} else {
						$package->set('release',$sig[2]);
					}
				}

				if ($package->save() && $package->install()) {
					return array(
						'success' => 1,
						'message' => '<b>'.$packageName.'</b> was successfully installed',
					);
				}
				else {
					return array(
						'success' => 0,
						'message' => 'Could not save package <b>'.$packageName.'</b>',
					);
				}
				break;
			}
		}
	}
	else {
		return array(
			'success' => 0,
			'message' => 'Could not find <b>'.$packageName.'</b> in MODX repository',
		);
	}
	return true;
}

function download($src, $dst) {
	if (ini_get('allow_url_fopen')) {
		$file = @file_get_contents($src);
	}
	else if (function_exists('curl_init')) {
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $src);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT,180);
		$safeMode = @ini_get('safe_mode');
		$openBasedir = @ini_get('open_basedir');
		if (empty($safeMode) && empty($openBasedir)) {
			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		}

		$file = curl_exec($ch);
		curl_close($ch);
	}
	else {
		return false;
	}
	file_put_contents($dst, $file);

	return file_exists($dst);
}

// LOGIN

$_user = [
	'username' => 'ваш_логи',
	'password' => 'ваш_пароль',
	'rememberme' => true,
	'login_context' => 'mgr'
];
$response = $modx->runProcessor('/security/login', $_user);
$user = $modx->getObject('modUser', array('username' => $_user['username']));
$modx->user = $user;


print "LOGIN: Done!\n";

// FOLDERS

$_folders = [
	'userdata/',
	'templates/'
];

foreach ($_folders as $folder) {
	$cache->writeTree(MODX_BASE_PATH.$folder);
}

print "FOLDERS: Done!\n";

// RENAME ht.access

rename(MODX_BASE_PATH.'ht.access', MODX_BASE_PATH.'.htaccess');
rename(MODX_BASE_PATH.'core/docs/changelog.txt', MODX_BASE_PATH.'core/docs/_changelog.txt');

print "RENAME: Done!\n";

// MEDIA SOURCES

$_media_sources = [
	[
		'name' => 'Userdata',
		'basePath' => 'userdata/',
		'baseUrl' => 'userdata/'
	]
];

foreach ($_media_sources as $config) {
	$source = $modx->runProcessor('source/create', [
		'name' => $config['name'],
		'class_key' => 'sources.modFileMediaSource'
	]);

	if ($source->isError()) {
		$modx->log(1, 'Failed to create Source. Message: '.$source->getMessage());
	}

	$source = $modx->getObject('modMediaSource', $source->response['object']['id']);
	$properties = $source->getProperties();
	$properties['basePath']['value'] = $config['basePath'];
	$properties['baseUrl']['value'] = $config['baseUrl'];
	$source->setProperties($properties);
	$source->save();
}

print "MEDIA SOURCES: Done!\n";

// PROVIDERS

$_providers = [
	[
		'name' => 'modstore.pro',
		'service_url' => 'https://modstore.pro/extras/',
		'username' => '',
		'api_key' => '',
		'description' => ''
	],
];

foreach ($_providers as $properties) {
	$provider = $modx->runProcessor('workspace/providers/create', $properties);

	if ($provider->isError()) {
		$modx->log(1, 'Failed to create Provider. Message: '.$provider->getMessage());
	}
}

print "PROVIDERS: Done!\n";

// PACKAGES

$_packages = [
	1 => [
		'translit',
		'FormIt',
		'ClientConfig',
		'MIGX',
		'CKEditor',
		'filetranslit',
		'Console',
		'simpleUpdater',
	],
	2 => [
		'pdoTools',
		'Ace',
		'phpThumbOn',
		'AjaxForm',
	]
];

foreach ($_packages as $provider => $packages) {
	foreach ($packages as $package) {
		installPackage($package, $provider);
		print $package.": Done!\n";
	}
}

print "PACKAGES: Done!\n";

// RESOURCES

$_resources = [
	[
		'pagetitle' => '404',
		'alias' => '404',
		'hidemenu' => 1,
		'published' => 1,
		'content' => '<p>Такой страницы не существует.</p>'
	],
	[
		'pagetitle' => 'sitemap.xml',
		'alias' => 'sitemap',
		'content_type' => 2,
		'template' => 0,
		'hidemenu' => 1,
		'published' => 1,
		'richtext' => 0,
		'content' => '[[!pdoSitemap]]'
	],
	[
		'pagetitle' => 'robots.txt',
		'alias' => 'robots',
		'content_type' => 3,
		'template' => 0,
		'hidemenu' => 1,
		'published' => 1,
		'richtext' => 0,
		'content' => "User-agent: *\nDisallow: /"
	]
];

foreach ($_resources as $properties) {
	$resource = $modx->runProcessor('resource/create', $properties);

	if ($resource->isError()) {
		$modx->log(1, 'Failed to create Resource. Message: '.$resource->getMessage());
	}
}

print "RESOURCES: Done!\n";

// OPTIONS

// get media source id
$default_media_source = $modx->getObject('modMediaSource', [
	'name' => $_media_sources[0]['name']
]);

$default_media_source = $default_media_source->toArray()['id'];

// get error page id
$error_page = $modx->getObject('modResource', [
	'pagetitle' => $_resources[0]['pagetitle']
]);

$error_page = $error_page->toArray()['id'];

$_options = [
	'site_name' => 'SITE_NAME',
	'emailsender' => 'ваша_почта',

	'server_protocol' => 'http',
	'friendly_alias_realtime' => 1,
	'friendly_alias_restrict_chars' => 'alphanumeric',
	'friendly_alias_translit' => 'russian',
	'friendly_urls' => 1,
	'friendly_urls_strict' => 1,
	'use_alias_path' => 1,
	'use_frozen_parent_uris' => 1,
	'confirm_navigation' => 0,
	'welcome_screen' => 0,
	'default_template' => 1,
	'link_tag_scheme' => 'abs',
	'log_snippet_not_found' => 0,
	'log_deprecated' => 0,
	'publish_default' => 1,
	'feed_modx_news_enabled' => 0,
	'feed_modx_security_enabled' => 0,
	'send_poweredby_header' => 0,

	'ace.font_size' => '14px',
	'ace.theme' => 'tomorrow_night',
	'pdotools_fenom_options' => '{"strip":true}',
	'pdotools_fenom_parser' => 1,

	'default_media_source' => $default_media_source,
	'error_page' => $error_page
];

foreach ($_options as $key => $value) {
	if ($option = $modx->getObject('modSystemSetting', $key)) {
		$option->set('value', $value);
		$option->save();
	}
}

print "OPTIONS: Done!\n";

// CONTENT TYPE

$content_type = $modx->getObject('modContentType', [
	'name' => 'HTML'
]);

if ($content_type) {
	$content_type->set('file_extensions', '/');
	$content_type->save();
}

print "CONTENT TYPE: Done!\n";

// CLEAR CACHE

$cache->refresh();

print "ALL Done!\n";
Андрей
07 мая 2019, 08:52
0
Вот так работает на fenom, надо массив передавать

'additionalPlaceholders' => [
    'mode' => 'slider'
]

В чанке будет
{$additionalPlaceholders.mode}
Андрей
01 мая 2019, 19:50
0
num это плейсхолдер, его надо передать при вызове лексикона

{'ms2_email_subject_new_user' | lexicon : [
    'num' => $order.num
]}
Андрей
25 апреля 2019, 21:52
0
Во вкладке Параметры вывода или как-то так называется, там можно указать разделитель.
Андрей
25 апреля 2019, 21:40
0
В настройках TV поставьте разделитель запятую например.
Андрей
25 апреля 2019, 21:16
0
А что показывает если просто $_modx->resource.officenapravleniya на странице вывести?

{set $ids = $_modx->resource.officenapravleniya | split : '||'}

'where' => [
	'id:IN' => $ids
]
Можно еще добавить параметр 'showLog' => 1 и посмотреть в чем проблема
Андрей
25 апреля 2019, 21:07
0
'where' => [
    'id:LIKE' => '%'~$_modx->resource.officenapravleniya~'%'
]
Андрей
19 апреля 2019, 20:55
+1
Что бы на мобилах был плавный скролл в фильтрах надо добавить

.sidebar-offcanvas {
    -webkit-overflow-scrolling: touch;
}

Да и вообще, все решение сводится к тому, что по кнопке класс у блока переключать.
Андрей
28 марта 2019, 19:53
0
Можно экранировать кавычки

{$file['name'] | escape}
Андрей
27 марта 2019, 20:26
1
+1
Я таким способом пользуюсь, просто дата файла

if ($modx->event->name == 'pdoToolsOnFenomInit') {

	// return file version
	$fenom->addModifier('version', function ($input) use ($modx) {
		$output = $input;

		$file = MODX_BASE_PATH.$input;

		if (file_exists($file)) {
			$output = $input.'?v='.filemtime($file);
		}

		return $output;
	});
	
}
Андрей
21 февраля 2019, 08:51
0
Там вроде бы массив или json надо указывать, где ключ это название сниппета, а его значение это параметры. Я уже точно не помню. Я тогда просто свое решение написал для экспорта.
Андрей
08 февраля 2019, 17:03
+1
Примерный код сниппета, например назовем его getTopList

<?
$pdo = $modx->getService('pdoFetch');

$ids = $modx->getOption('ids', $scriptProperties, '');
$tpl = $modx->getOption('tpl', $scriptProperties, '');

$data = [];

if (!$ids) {
	return;
}

$ids = explode(',', $ids);

$q = $modx->newQuery('recordTopList'); // имя вашего класса
$q->leftJoin('modResource', 'Resource', 'recordTopList.resource_id = Resource.id');
$q->where([
	'Resource.published' => 1,
	'Resource.id:IN' => $ids
]);
$q->select([
	'Resource.pagetitle as pagetitle',
	'Resource.id as rid',
	'recordTopList.*'
]);

if ($q->prepare() && $q->stmt->execute()) {
	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		$data[$row['rid']][] = $row;
	}
}

if (!empty($data)) {
	return $pdo->getChunk($tpl, [
		'data' => $data
	]);
}

Пример вызова сниппета
[[!getTopList?
	&ids=`10,20` //id ресурсов
	&tpl=`@INLINE
		{foreach $data as $rid => $records}
			<div>
				{$rid}, {$records[0]['pagetitle']}

				{foreach $records as $record}
					{$record.resource_id}
				{/foreach}
			</div>
		{/foreach}
	`
]]
Андрей
08 февраля 2019, 13:32
0
В минишопе есть статусы заказов, ими и пользуйтесь для обработки и отправки писем. А на странице заказа сделайте фейковый выбор метода оплаты и записывайте выбранный способ в поле с комментарием, что бы менеджер знал какой метод выбрать при отправке ссылки на оплату. Реальные методы оплаты скройте на странице заказа и по-умолчанию пускай будет метод оплаты без привязки платежной системы, что бы при оформлении заказа не было перехода на оплату.
Андрей
01 февраля 2019, 15:50
+1
Можно передавать свои данные через prepareSnippet. Посмотрите этот комментарий, аналогично работает и для pdoToos.

modx.pro/help/17267#comment-105922
Андрей
01 февраля 2019, 15:41
0
Брать заказ из сессии (корзину) и сохранять в свою таблицу (migxdb подойдет) какую-нибудь (при добавлении товара в корзину, при заходе на страницу оформления заказа или любой другой триггер) вместе с id пользователя. А в ЛК уже выводить из этой таблицы данные не оформленных заказов.
Андрей
25 января 2019, 14:55
0
Нашел, она во вкладке Настройки на странице компонента, а я искал в системных настройках, ее там нет.
Андрей
25 января 2019, 14:48
0
Тогда да, определённо нужно задействовать настройку seofilter_hidden_tab.
А где эта настройка? В настройках не вижу ее.
Андрей
21 января 2019, 15:35
+1
У минишопа есть такая штука как Связи товаров, через них и делайте.
Андрей
20 января 2019, 12:34
+1
Можно добавить алиасы для этих полей по ним назначить шаблоны

&aliases=`resource|publishedon:year==year,resource|publishedon:month==month`,
&tplFilter.outer.year=`чанк`,
&tplFilter.outer.month=`чанк`
Андрей
20 января 2019, 12:06
0
docs.modx.pro/komponentyi/msearch2/snippetyi/mfilter2#%D0%A7%D0%B0%D0%BD%D0%BA%D0%B8-%D0%B8-%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

Для каждого фильтра можно указать 2 собственных чанка
&tplFilter.outer.таблица|поле=`tpl.mFilter2.filter.outer`
&tplFilter.row.таблица|поле=`tpl.mFilter2.filter.checkbox`