Андрей

Андрей

С нами с 09 апреля 2015; Место в рейтинге пользователей: #70
Максим Кузнецов
05 января 2015, 10:06
4
+1
Если честно, я и прелести tagLister'a не оценил — он уж на случай крайней лени, как по мне.

Вот как реализованы теги у меня (может, кому пригодится):

1. Дополнительное поле «tags»
Параметры ввода: Авто-метка (можно и простой строкой, по желанию)

2. Сниппет «tags», делающий теги ссылками (для последующего поиска по ним)
<?php
	if ($input == ''){
		return;
	}
	$tags = explode(',',$input);
	foreach ($tags as $key => $value){
		$output[] = '<a href="'.$modx->makeurl($tagsPage, '').'/'.$value.'" itemprop="keywords">'.$value.'</a>'; 
	} 
	return implode(', ',$output);

3. Вывод в чанке
[[*tags:notempty=`
<div class="tagList" itemscope itemtype="http://schema.org/CreativeWork">
	[[!tags? &tagsPage=`91` &input=`[[*tags]]`]]
</div>
`]]
— где &tagsPage — параметр, определяющий айди страницы поиска по тегам для формирования ссылки

Ну и дополнительно, для «полного спектра услуг»:

4. Создаем страницу "Поиск по тегам" с псевдонимом tag, где будем выводить все теги, удовлетворяющие запросу:
[[!pdoPage &parents=`0` &includeContent=`1` &where=`{"tags:LIKE":"%[[!GET? &get=`tag`]]%"}` &includeTVs=`tags` &limit=`10` &sortby=`createdon` &sortdir=`DESC` &depth=`1` &tpl=`tag.Item`]]
— где сниппет GET перехватывает выбранный тег в адресной строке.

GET
<?php
	return $_GET[$get];

5. Дописываем .htaccess, чтобы адресная строка поиска приняла вид site.ru/tag/Название_тега
RewriteRule ^tag/([^/]+)$ /tag?tag=$1 [L]
Николай
13 октября 2014, 15:56
3
+1
Да, все больше чем элементарно.
Вариантов решения несколько. Какой будет лучше конкретно вам — решайте сами.
1. В лоб редактирование класса корзины. Находится он тут:
/core/components/minishop2/model/minishop2/mscarthandler.class.php
Интересовать вас будет функция add, и строчка
$price = $product->getPrice();
Работаете непосредственно с ней.

2. Расширить класс корзины, и манипулировать ценой в новом классе. Преимущество перед предыдущим способом в том, что после обновления ms2 все перезапишется, а тут нет. Но и сложнее реализация.
Информацию по этому ищите в поиске, я не могу точно вспомнить где об этом писал Василий.

3. Плагины. Вам нужно создать плагин, который на событие msOnBeforeAddToCart будет пересчитывать цену.
* Also you can modify $count and $options variables by add values to $this->modx->event->returnedValues
<?php
  if ($modx->event->name = 'msOnBeforeAddToCart') {
  $values = & $modx->event->returnedValues;
  $values['count'] = $count + 10;
  $values['options'] = array('size' => '99');
}
*
 * */
Пример взят из файла с классом корзины. Я лично использовал 1 способ, т.к делал для себя.
Василий Наумкин
30 сентября 2014, 11:46
2
0
Или не больше 2х LIKE, если не знаешь точного имени:
&where=`{"File.name:LIKE":"%file1%","OR:File.name:LIKE":"%file2%"}`
или сколько угодно в IN, если знаешь:
&where=`{"File.name:IN":["file1.jpg","file2.jpg"]}`

Больше 2х LIKE использовать не получится, потому что иначе ключ массива «OR:File.name:LIKE» в условии будет повторяться и значение в нём — затираться.
Юрий Эффа
26 сентября 2014, 22:34
1
+2
Спасибо за волшебный пендель)
Сделал так:
1. Переименовал колонку price (из _ms2_products), в которой были все цены, в price_eur
2. Привязал её к карточке товара, как это описано ЗДЕСЬ. Т.е. на странице товара в админке у меня появилось поле Цена, у.е. (да в лексиконах тоже запись сделал).
3. Создал колонку price в _ms2_products
4. В парсер, который должен выполняться по крону, добавил
$sql1 = "UPDATE ".$modx->getTableName('msProductData')." SET `price` = ".str_replace(',','.',$euro)." * `price_eur` WHERE `price_eur` > 0";
$q = $modx->prepare($sql1);
$q->execute();
и это, и сам парсер взяты отсюда: Цена в рублях по курсу доллара в miniShop2.
5. Отключил сниппет модификатор цен!
6. Руками запустил парсер — колонка price в _ms2_products обновилась.
7. Фильтры заработали по колонке прайс )
Evgeny Epifanov
23 сентября 2014, 22:05
8
+1
Чанк tpl.msEmail.new.manager
[[+address.receiver]] — Покупатель
[[+address.phone]] — Телефон
[[+user.email]] — Почта
[[+address.index]] — Индекс
[[+address.region]] — Область
[[+address.city]] — Город
[[+address.street]] — Улица
[[+address.building]] — Дом
[[+address.room]] — Квартира
[[+delivery.name]] — Способ доставки
[[+payment.name]] — Тип оплаты
[[+address.comment]] — Комментрарий

Это то, что я знаю. А вообще где-то это уже обсуждалось.
Василий Наумкин
09 июня 2014, 13:22
2
+1
$name = 'Sony';
if (!$vendor = $modx->getObject('msVendor', array('name' => $name))) {
	$vendor = $modx->newObject('msVendor', array('name' => $name));
	$vendor->save();
}

return $vendor->get('id');
Алексей Ерохин
03 июня 2014, 01:55
1
+2
Поля publishedon, createdon, editedon, deletedon хранятся в базе в виде int(20). Вам нужно Вашу дату перевести в unix timestamp. Например, 1401235200 для 2014-05-28 00:00:00 в GMT.
Либо использовать &where без json:
&where=`modResource.publishedon > UNIX_TIMESTAMP('2014-05-28 00:00:00')`
wld
wld
07 мая 2014, 20:06
5
0
или же не указываем
<base href="[[++base_url]]" />
а в Настройках системы — core — Сайт
Схема URL (link_tag_scheme) установить значение abs
Для справки:
-1: (default value) URL is relative to site_url
0: see http
1: see https
full: URL is absolute, prepended with site_url from config
abs: URL is absolute, prepended with base_url from config
http: URL is absolute, forced to http scheme
https: URL is absolute, forced to https scheme

И при вызове pdoMenu или подобных снипетов указывать:
&scheme=`abs`
По идее, в подобных снипетах можно было бы дергать эту схему урл по дефолту из link_tag_scheme, но почему то так не все так делают(

Отличия:
В первом случае, как указал Василий, при создании якорей, необходимо указывать ссылку на текущую страницу:
<a href="[[~id]]#test">Ссылка</a>
В моем случае, достаточно указать только якорь:
<a href="#test">Ссылка</a>
Andrey Grachov
19 апреля 2014, 12:06
1
+2
Это была дружеская помощь, если будет что-то серьезное — обращайтесь :)
Пример оставим для истории, для тех кто придет, а ссылка уже не работает:
// Вызов mFilter2
[[!mFilter2? &parents=`[[*id]]` &filters=`resource|publishedon:date` &tplFilter.row.resource|publishedon=`tpl.mFilter2.filter.date`]]

// Чанк tpl.mFilter2.filter.date
[[+idx:is=`0`:then=`
    <input type="hidden" name="[[+table]][[+delimeter]][[+filter]]" id="mse2_[[+table]]_[[+filter]]_[[+idx]]" value=""/>
    <div id="mse2_[[+table]]_[[+filter]]_[[+idx]]_datepicker"></div>
    <script type="text/javascript">
        $(function () {
            $('#mse2_[[+table]]_[[+filter]]_[[+idx]]_datepicker').datepicker({
                altField: '#mse2_[[+table]]_[[+filter]]_[[+idx]]',
                dateFormat: 'yy-mm-dd'
            });
        });
    </script>
`:else=``]]
grasp graspoff
24 марта 2014, 19:56
3
+1
class myDelivery extends msDeliveryHandler {
    public function getCost(msOrderInterface $order, msDelivery $delivery, $cost=0) {
    $totalCostDL=0;
    $products=$this->ms2->cart->get();
    foreach($products as $product){
        $costDL=$this->getPrDlCost($product);
        $totalCostDL += $costDL;
    }
    $cost += $totalCostDL;
    return $cost;
	}
Ну и функция с логикой
private function getPrDlCost($product) {
        $PrDlCost=1000000;
        $pids = $this->modx->getParentIds($product['id'],1);
        $PrCategory = $pids[0];
        $PrCount = $product[count];
        switch ($PrCategory) {
	case '67': 
				if ($PrCount <= 6) $PrDlCost = 1200;
				if ($PrCount > 6 && $PrCount <= 15) $PrDlCost = 1700;
				if ($PrCount > 15 && $PrCount < 25) $PrDlCost = 3900;
				if ($PrCount >= 25) $PrDlCost = 0;
                break;
		....
	}