Иван Бондаренко

Иван Бондаренко

С нами с 30 января 2013; Место в рейтинге пользователей: #91
Антон ХайЭксель
16 июля 2015, 02:10
3
+1
Просуммирую метод Володи, думаю может понадобится кому-то еще

1. естественно меняем класс обработчик фильтров. Идем в настройки системы и в настройках mSearch2 меняем параметр mse2_filters_handler_class на CustomFilter

2. теперь нам нужно создать сам класс. для этого создаем файл core/components/msearch2/custom/filters/custom.class.php с содержимым

<?php
class CustomFilter extends mse2FiltersHandler {

    public function getMsOptionMyValues(array $keys, array $ids) {
		$filters = array();
		$q = $this->modx->newQuery('msProductOption');
		$q->where(array('product_id:IN' => $ids, 'key:IN' => $keys));
		$q->select('`product_id`,`key`,`value`');
		$tstart = microtime(true);
		if ($q->prepare() && $q->stmt->execute()) {
			$this->modx->queryTime += microtime(true) - $tstart;
			$this->modx->executedQueries++;
			while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
				$value = trim($row['value']);
				if ($value == '') {continue;}
				$key = $row['key'];
				// Get ready for the special options in "key==value" format
				if (strpos($value, '==')) {
					list($key, $value) = explode('==', $value);
					$key = preg_replace('/\s+/', '_', $key);
				}
				// --
				if (isset($filters[$key][$value])) {
					$filters[$key][$value][] = $row['product_id'];
				}
				else {
					$filters[$key][$value] = array($row['product_id']);
				}
			}
		}
		else {
			$this->modx->log(modX::LOG_LEVEL_ERROR, "[mSearch2] Error on get filter params.\nQuery: ".$q->toSql()."\nResponse: ".print_r($q->stmt->errorInfo(),1));
		}
		return $filters;
	}

	public function buildDefaultMyFilter(array $values, $name = '') {
		if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
			return array();
		}
		$results = array();
		foreach ($values as $value => $ids) {
			$results[$value] = array(
				'title' => $value
				,'value' => $value
				,'type' => 'default'
				,'resources' => $ids
			);
		}
		ksort($results);
		return $results;
	}
	

    public function filterDefaultMy(array $requested, array $values, array $ids) {
		$matched = array();
		$tmp = array_flip($ids);
		foreach ($requested as $value) {
			if (isset($values[$value])) {
				$resources = $values[$value];
				foreach ($resources as $id) {
					if (isset($tmp[$id])) {
						$matched[] = $id;
					}
				}
			}
		}
		
	    $match = $matched;
		$matched = array();
		$count = count($requested);
		$count_values = array_count_values($match);
		foreach ($count_values as $id => $value) {
		    if ($value >= $count) {
		        $matched[] = $id;
		    }
		    else {
		        $matched[] = 0;
		    }
		}
		return $matched;
	}
	
}
осталось добавить в чанк вызова мфильтра строчку

&filters=`
		msoption|tags:DefaultMy'


вуаля — фильтр работает как нужно ;)
Максим Кузнецов
26 июня 2015, 22:38
1
0
Создайте плагин на событие OnDocFormSave (+ какой-нибудь доп.фильтр, чтобы чистился только из фронта) или вшейте в сниппет создания ресурса с фронтэнда:
$modx->cacheManager->refresh(array(настройки_для_детальной_очистки_кэша));
или
$modx->cacheManager->clearCache(путь до кэша, доп.опции);
Подробнее здесь.
Дмитрий Аюпов
Дмитрий Аюпов
06 июня 2015, 22:43
2
+1
Не умею гитхабом пользоваться, поэтому напишу сюда, кому надо, найдет.

Инструкция по добавлению дополнительного поля в minishop2.
В результате получится поле проходящее сквозь админку, сайт, письмо клиенту и останется в «Заказах».
1. Добавляем дополнительное свойство товара. Приложения/minishop2/ настройки/опции/создать/ Ключ — text, Название — Текст, Тип свойства — Текстовая область

2. Ресурсы/Ваша категория с товарами/Опции/Добавить/характеристику/ text и Включен
3. Товар/Основные свойства/Свойства товара/Текст/ заполняем

4. Переходим в шаблон/чанк вывода товара, по умолчанию — msProduct.content
Пишем внутрь
<!--form action="product.html"--> <input  type="text" name="options[text]" value="[[+text]]">
5. На сайте появился input где выводится текст, который мы заполнили в Товаре, мы можем туда записать любую информацию. Можно сделать
<input type="hidden">
тогда можно записывать информацию не показывая ничего на сайте.
6. Добавляем вывод текста в комментарии в корзине tpl.msCart.row [[+option.text]]
7. Добавляем вывод текста в письме tpl.msGetOrder.row [[+option.text]]
Отправляем, смотрим письмо и админку


p.s. Я тут новичек пока и не понимаю зачем кто-то на все мои сообщения минусы наставил. Здесь так принято? Если претензии какие-то, то напишите, постараюсь исправиться. Зачем исподтишка мудить?
Василий Наумкин
19 мая 2015, 08:43
2
+1
[[!pdoResources?
	&useFenom=`1`
	&parents=`0`
	&tpl=`@INLINE
	<p>Данные ресурса: {$id} - {$pagetitle}
		{if $parent != 0}
			{set $doc = $pdoTools->getArray('modResource', $parent, ['select' => 'pagetitle,uri'])}
			{if $doc}
				<ul>Данные родителя: {$doc.pagetitle} - {$doc.uri}</ul>
			{/if}
		{/if}
	</p>
	`
]]
Илья Уткин
31 марта 2015, 16:20
3
+2
&sortby=`{"Data.price":"ASC","Data.popular":"DESC"}`
так не подходит?
Наумов Алексей
12 февраля 2015, 14:14
3
0
[[!getTickets:default=`<p class="warning">У вас нет ни одного черновика.</p>`?
  &tpl=`blogs.Post.Draft.Row`
  &limit=`0`
  &parents=`0`
  &fastMode=`1`
  &showUnpublished=`1`
  &user=`[[+modx.user.id]]`
  &where=`{"published": 0}`
]]
Fi1osof
22 января 2015, 15:42
5
+3
Ставите Console.
Выполняете код:
ini_set('max_execution_time', 0);
ignore_user_abort(true);
$c = 'modResource';
$q = $modx->newQuery($c);
$q->sortby('id');
$q->select(array(
	"{$c}.*",
));
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(2))
	$response = $modx->runProcessor('resource/update', $row);
	if($response->isError()){
		print_r($response->getResponse());
		return;
	}
	$modx->error->reset();
}
Так как у вас документов много, советую сначала прогнать только корневые документы (добавить в запрос $q->where(array('parent' => 0));), а потом по каждому разделу в отдельности, указывая соответствующий parent.
Алексей Карташов
05 января 2015, 15:56
1
+1
Я тут долго расписывал чем вредны теги, но надоело, если честно, и я забил)
Поэтому просто расскажу, как _надо_ делать тегирование.

Нужны:
1. Тикетс;
2. 2 tv;
3. 1 плагин;
4. 1 таблица.

Создаём раздел с тикетами. Называем его, к примеру «Теги» :-)
Создаём tv. В него будем записывать теги для страницы.
На сохранение ресурса (у которого д.б. теги), в плагине, смотрим в этот tv, разбираем теги и на каждый создаём тикет в нашем разделе «Теги». У этих тикетов-тэгов д.б. tv-шка, в которую мы в исходном виде записываем текст тега.
Потом записываем в нашу таблицу id ресурса и id тикета-тега (сколько тегов, столько и записей в таблице), не забывая перед этим очистить все прошлые записи для этого ресурса (ну вдруг мы отредактировали ресурс и какой-то тег удалили. Чтобы не заморачиваться с логикой — просто удаляем все записи для этого ресурса, а потом сохраняем текущие).
Выборку статей с данным тегом делать pdoResource'ом.

Собственно всё.
Я бы собрал пакетик на днях, да только болею я.

В общем, в чём профит.
На каждый тег будет отдельный ресурс. Да, если тегов 1000, то и ресурсов будет 1000. Если кого-то такой вариант не устраивает, то… не мои это проблемы)
Смысл в том, что у каждой страницы-тега можно редактировать урлы, контент, тайтлы, дескрипшены, да и вообще что душа пожелает — это же обычный ресурс. Это просто рай для любого более-менее грамотного сеошника. Вы в своих интернет-магазинах (и не только) сможете просто нереально расширить семантику, поднять траффика и позиции по куче низкочастотников. Достаточно небольшого уникального текста символов на 300, уникального тайтла и дескрипшена на каждой легированной странице. Вот и всё.
Все остальные варианты тегирования, в большинстве случаев, будут только во вред.

Между прочим, такие темы на платных закрытых вебинарах задвигают. А я вам готовый инструмент практически дал. Не упускайте шанс, как говорится.

Всем добра :-)
Илья Уткин
26 декабря 2014, 17:32
1
+1
<?php
$bufer = &$modx->resource->_output;
$search = array(
        '/\>[^\S ]+/s',  // strip whitespaces after tags, except space
        '/[^\S ]+\</s',  // strip whitespaces before tags, except space
        '/(\s)+/s'       // shorten multiple whitespace sequences
    );
$replace = array(
        '>',
        '<',
        '\\1'
    );
$buffer = preg_replace($search, $replace, $buffer);
Василий Наумкин
20 октября 2014, 15:23
1
0
Да, блин, включи логику!

Рабочий код
$res = $row['bal'];
Нерабочий код
$res = $row('made');

Чем отличается рабочий код от нерабочего? Что нужно исправить?