Scorp Satex

Scorp Satex

С нами с 06 марта 2013; Место в рейтинге пользователей: #226
Баха Волков
06 февраля 2020, 22:07
5
+12
Не не не, не делайте так, помните или почитайте о DRY. С парсером MODX все понятно, ей сложно помочь, но феном-то полноценный шаблонизатор:

{foreach ['receiver', 'phone', 'index', 'region', 'city', 'street', 'building', 'room', 'comment', 'customfield'] as $field}
    {if $address[$field]?}
        <tr>
            <td style="{$style.th};width: 200px; font-weight: 600;">{('ms2_frontend_' ~ $field) | lexicon}: </td>
            <td style="{$style.th}">{$address[$field]}</td>
        </tr>
    {/if}
{/foreach}

8 моих строчек против твоих 80-ти
Володя
27 января 2017, 22:04
1
+1
указать в параметре where
&where=`{"msDelivery.id:IN":[1,2], "msPayment.id:IN":[1,2,3]}`
Максим Кузнецов
05 января 2017, 16:54
1
+3
С минимальным функционалом, облако тегов к компоненту можно реализовать следующим способом:

1. Создаем сниппет (tags.list):
<?php
	$pdoTools = $modx->getService('pdoTools');
	$TvSuperSelect = $modx->getService('tvsuperselect', 'tvsuperselect', MODX_CORE_PATH . 'components/tvsuperselect/model/tvsuperselect/');
	if (!$TvSuperSelect) {
		$modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось загрузить TvSuperSelect');
		return;
	}

	$q = $modx->newQuery('tvssOption');
	$q->groupby('value');
	$q->select('value, tv_id');
	$q->where(array(
		'tv_id' => $tv_id
	));
	
	if ($q->prepare() && $q->stmt->execute()) {
		$tags = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
	}
	
	$tags_page = $modx->makeUrl($tags_page, '', '', 'full');
	
	foreach($tags as $tag) {
		$result  .= $pdoTools->getChunk($tpl, array(
			'tag' => $tag['value'],
			'tags_page' => $tags_page
		));
	}
	
	return $result;

2. Создаем чанк для отображения кнопки тега (tags.list.item):
<a href="{$tags_page}{$tag | replace : " " : "%20"}/">{$tag}</a><br />

3. Вызываем созданный сниппет:
{$_modx->runSnippet('!tags.list', [
	'tv_id' => 5,
	'tpl' => 'tags.list.item',
	'tags_page' => 99
])}

При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла.
Володя
30 сентября 2016, 17:32
2
+2
создайте настройку ms2_cart_max_count и укажите там нужное ограничение.
Дмитрий Середюк
12 февраля 2016, 10:56
1
+2
[[Sendex? 
&tplActivate=`tpl.Sendex.activateX` 
&tplSubscribeAuth=`tpl.Sendex.subscribe.authX` 
&tplSubscribeGuest=`tpl.Sendex.subscribe.guestX` 
&tplUnsubscribe=`tpl.Sendex.unsubscribeX` 
&id=`1`
]]
tpl.Sendex.activateX — письмо которое будет отправлено на почту, для подписки на рассылку!
Для активации добровольной подписки с сайта <a href="[[++site_url]]">[[++site_name]]</a> пройдите по ссылке ниже!</br>
[[+link]]
tpl.Sendex.subscribe.authX — чанк с подпиской для авторизированных!
<form action="" method="post">
    <div class="form-group">
        <div class="col-sm-12 padding0 colora1a5ab margin-bottom10">
            [[%sendex_subscribe_intro?name=`[[+name]]`]]
        </div>
        <div class="col-sm-12 padding0">
    	    <input type="hidden" name="sx_action" value="subscribe">
            <button class="btn x btn-default revZ-in1" type="submit">[[%sendex_btn_subscribe]] <i class="glyphicon glyphicon-send"></i></button>
        </div>
    </div>
	<span class="error">[[+message]]</span>
</form>
tpl.Sendex.subscribe.guestX — ваш вариант для неавторизированных! просто input и кнопка!
<form action="" method="post">
    <div class="col-sm-12 padding0 colora1a5ab margin-bottom10">
        [[%sendex_subscribe_intro?name=`[[+name]]`]]
    </div>
	<div class="input-group">
        <input class="form-control anonimInput" type="email" name="email" value="" placeholder="Email">
        <input type="hidden" name="sx_action" value="subscribe">
		<span class="input-group-btn">
			<button class="btn btn-default" type="submit" style="padding: 6px 11px;"><i class="glyphicon glyphicon-send"></i>[[-%sendex_btn_subscribe]]</button>
		</span>
	</div>
	<span class="error">[[+message]]</span>
</form>
tpl.Sendex.unsubscribeX — отписка от рассылки
<form action="" method="post">
	<!--[[-%sendex_unsubscribe_intro?name=`[[+name]]`]] 
-->
	<div class="form-group">
        <div class="col-sm-12 padding0 colora1a5ab margin-bottom10">
    	   [[%sendex_unsubscribe_intro?name=`[[+name]]`]]
    	</div>    
            <div class="col-sm-12 padding0">
        	    <input type="hidden" name="code" value="[[+code]]">
            	<input type="hidden" name="sx_action" value="unsubscribe">
            	<button  class="btn x btn-default revZ-in1" type="submit">[[%sendex_btn_unsubscribe]] <i class="glyphicon glyphicon-send"></i></button>
            </div>
        </div>
    </div>	
	<span class="error">[[+message]]</span>
</form>

наглядно можно глянуть тут!
Павел Гвоздь
16 августа 2015, 20:43
6
+3
Вот какой-то плагин писал давненько. Как раз отсылает мыло. А если мыло не ввели, то создаёт юзера вот с таким мылом «телефон@сайт-на-котором-регается-юзер.ru». На том сайте мне надо было вводить либо мыло, либо телефон. Поэтому такое решение.

Обновлено: В конце там у нас есть код — если юзер авторизован, то записать данные введённые в заказе в Profile.

<?php
$mail_subj_text = 'Регистрация на ' . $modx->getOption('site_name');
$chunk_mail_reg = 'tpl.mail.userRegisterFromOrderSubmit';
$suffix_email = '@сайт-на-котором-регается-юзер.ru';

switch ($modx->event->name)
{
	
	// Обработка события, чтобы узнать, существовал ли юзер раньше..
	// А также подставляет левый email, если он не заполнен, а "телефон" заполнен
	case "msOnSubmitOrder":
		
		$order_data = $order->get();
		if( empty($order_user['email']) ) {
			$order_data = $data;
		}
		//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order->get() , true));
		//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true));
		
		// если email пуст или он с нашим суффиксом, то подставляем ему мыло вида - "телефон@suffix_email"
		if( empty($order_data['email']) || strstr($order_data['email'], $suffix_email) )
		{
			if( trim($order_data['phone']) != '' )
			{
				$phone = preg_replace( "/\D/", "", $order_data['phone'] );
				$data['email'] = $order_data['email'] = ( $phone ) . $suffix_email;
			}
			else
			{
				$data['email'] = $order_data['email'] = '';
			}
		}
		$modx->event->returnedValues['data'] = $data;
		
		// проверяем наличие мыла
		$email = $order_data['email'];
		if(empty($email)) { continue; }
		
		// проверяем на существование юзера по username=email, и если не существовал, то пишем соответствующее значение в сессию
		$_SESSION['minishop2']['new_user'] = false;
		if( !$modx->getCount('modUser', array('username' => $email)) )
		{
			$_SESSION['minishop2']['new_user'] = $email;
			//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION['minishop2']['new_user'] , true));
		}
		
		//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $data , true));
		
	break;
	
	
	case "msOnCreateOrder":
		
		$order_user = $order->get();
		
		// если email с суфиксом нашего сайта - то не продолжаем
		if( strstr( $order_user['email'], $suffix_email ) ) { continue; }
		
		// если не авторизован
		if( !$modx->user->isAuthenticated($modx->context->key) )
		{
			$email = $order_user['email'];
			if(empty($email)) {return false;}
			
			$user = $modx->getObject("modUser", array('username' => $email) );
			
			// Если юзер не существовал раньше (при событии msOnSubmitOrder), то ставим ему новый пароль и шлём сообщение о регистрации на мыло
			if( $_SESSION['minishop2']['new_user'] == $email )
			{
				$new_password = substr( md5(rand()), 0, 9 );
				$user->set('password', $new_password );
				$user->save();
				$modx->log(modX::LOG_LEVEL_ERROR, print_r( $new_password , true));
				
				// формируем письмо (тему и текст)
				$mail_subj = $mail_subj_text;
				$mail_body = $modx->getChunk( $chunk_mail_reg,
					array_merge(
						$user->getOne('Profile')->toArray(),
						$user->toArray(),
						array(
							'password' => $new_password,
						)
					)
				);
				
				
				// шлём письмо
				$mail = $modx->getService('mail', 'mail.modPHPMailer');
				$mail->set(modMail::MAIL_BODY, $mail_body);
				$mail->set(modMail::MAIL_FROM, $modx->getOption('emailsender'));
				$mail->set(modMail::MAIL_FROM_NAME, $modx->getOption('site_name'));
				$mail->set(modMail::MAIL_SENDER, $modx->getOption('emailsender'));
				$mail->set(modMail::MAIL_SUBJECT, trim($mail_subj));
				$mail->address('to', $email);
				$mail->address('reply-to', $modx->getOption('emailsender'));
				$mail->setHTML(true);
				$mail_response = !$mail->send()
					? $mail->mailer->ErrorInfo
					: true;
				
				// пишем в лог, если письмо не ушло
				if ($mail_response != true) {
					$modx->log(modX::LOG_LEVEL_ERROR, 'Не получилось отправить email на ящик '.$email.'. Сообщение: '.$mail_response);
				}
				$mail->reset();
			}
			
			//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $_SESSION[ 'user_' . $email ] , true));
		}
		else
		{
			$user = $modx->user;
			
			// записываем данные из формы в профиль
			$profile = $user->getOne('Profile');
			
			$profile->set('fullname', $order_user['receiver']);
			$profile->set('phone', $order_user['phone']);
			$profile->set('city', $order_user['city']);
			$profile->set('address', $order_user['street']);
			$profile->set('comment', $order_user['comment']);
			
			$profile->save();
		}
		
		//$modx->log(modX::LOG_LEVEL_ERROR, print_r( $order_user , true));
		
	break;
	
}
Илья Уткин
07 июля 2015, 09:25
1
+3
Как-то так:
[[!msProducts:toPlaceholder=`products`?
  &parents=`[[+id]]`
  &depth=`1`
  &where=`{«template»:5}`
  &limit=`30`
  &where=`{"Data.old_price:!=":0}`
  &tpl=`tpl.msProducts.row`
]]
[[+products:eq=``:then=``:else=`<p>[[+pagetitle]]</p>
<div class="prodicts">
  [[+products]]
</div>`]]
Юрий
21 апреля 2015, 13:56
1
+2
преимущества:
<div class="uk-container uk-container-center">
        <div class="uk-grid ">
            <div class="uk-width-1-1 uk-margin-large-top ">
                <h3 class="uk-h2 uk-text-center zm-text-danger">[[pdoField? &id=`87`]]</h3>
                <hr/>
            </div>
        </div>
        <div class="uk-grid uk-grid-small uk-nbfc" data-uk-grid-match="{target:'.uk-panel'}" >
            [[pdoResources? 
                &tpl=`tpl.benefits.item` 
                &tplFirst=`tpl.benefits.first.item`
                &sortby=`menuindex` 
                &sortdir=`ASC` 
                &parents=`87`
            ]]
        </div>
    </div>
Галерея:
<div class="uk-container uk-container-center uk-margin-large-top uk-margin-small-bottom">
        <div class="uk-grid  uk-text-center uk-margin-top">
            <div class="uk-width-1-1 uk-margin-bottom">
                <h3 class="uk-h2 zm-text-danger">[[pdoField? &id=`88`]]</h3>
                <hr/>
            </div>
        </div>
        <div class="uk-grid  uk-text-center uk-margin-top uk-margin-large-bottom">
            <div class="uk-width-1-1">
                [[ms2Gallery? 
                    &resource=`88`
                    &limit=`24`
                    &frontend_css=`` 
                    &frontend_js=`` 
                    &tplEmpty=`tpl.ms2Gallery.main-folio.empty` 
                    &tplOuter=`tpl.ms2Gallery.main-folio.outer` 
                    &tplRow=`tpl.ms2Gallery.Main-folio.row`
                ]]
           </div>
        </div>
    </div>
отзывы:
[[pdoResources? 
    &tpl=`opinion.main.row` 
    &sortby=`publishedon` 
    &showUnpublished=`0`
    &sortdir=`DESC` 
    &parents=`264` 
    &tplWrapper=`opinion.main.outer` 
    &scheme=`abs`
    &loadModels=`ms2gallery`
	&leftJoin=`{
		"360x270": {
			"class":"msResourceFile"
			,"alias":"360x270"
			,"on": "360x270.resource_id = modResource.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0"
		}
	}`
	&select=`{
		"modResource":"*"
		,"360x270":"360x270.url as 360x270"
	}`
	&includeContent=`1` 
	&includeTVs=`reviews-company,reviews-autor,reviews-project` 
	&processTVs=`1`
]]
Процес:
[[pdoResources? 
    &tpl=`process.row`
    &fastMode=`0` 
    &sortby=`menuindex` 
    &sortdir=`ASC` 
    &parents=`92` 
    &includeTVs=`process-icon,process-arrow,process-class,process-link` 
    &processTVs=`1` 
    &scheme=`abs`
    &tplWrapper=`process.outer`
]]
надеюсь этого хватит для начала :-)
Виктор Банев
21 апреля 2015, 00:08
1
+1
[[!pdoResources? &tpl=`@TEMPLATE` ]]
К сниппету написаны очень хорошие манулы.
Іван Клімчук
29 января 2015, 15:35
1
+1
Самое просто — это в переопределить класс msOrder и там унаследовать и переопределить методы получения списка доставок и списка платежей.