Скаут

Скаут

С нами с 22 мая 2017; Место в рейтинге пользователей: #361
Максим Кузнецов
25 марта 2017, 11:17
3
+3
Если использовать минимальное количество запросов, то можно воспользоваться fenom'ом примерно таким образом:

//Собираем ресурсы, из которых необходимо будет сформировать табы
{var $resource_list = $_modx->runSnippet('!pdoResources', [
	...
	'return' => 'json'
])}

//Родитель, от которого формируем табы
{set $tab_parent = '11'}

{set $tabs = ''}
{foreach $resource_list | fromJSON | split as $item}
	{set $parent = $item['parent']}
	{set $id = $item['id']}
	{set $pagetitle = $item['pagetitle']}

	//Настроить оформление по вкусу
	{if $parent == $tab_parent}
		{set $tabs = $tabs ~ '<a data-id="' ~ $id ~ '" class="tab-selector">' ~ $pagetitle ~ '</a>'}
	{else}
		{set $tab_childs[$parent][$id] = '<div class="body">' ~ $pagetitle ~ '</div>'}
	{/if}
{/foreach}


<div class="wrapper">
	<div class="tabs">{$tabs}</div>
	<div class="items">
		{foreach $tab_childs as $parent_id => $tab_content}
			<div data-parent="{$parent_id}" class="body">
				{foreach $tab_content as $tab_item}
					{$tab_item}
				{/foreach}
			</div>
		{/foreach}
	</div>
</div>
Виталий Серый
28 февраля 2017, 14:03
4
+4
Самое простое через ключ массива.
{*Первые два*}
{foreach $rows as $idx => $row}
	{if $idx < 2}
		<div>{$idx} - {$row.title}</div>
	{/if}
{/foreach}

{*С пятой строки*}
{foreach $rows as $idx => $row}
	{if $idx > 4}
		<div>{$idx} - {$row.title}</div>
	{/if}
{/foreach}

{*Чересстрочная вакханалия*}
{foreach $rows as $idx => $row}
	<div{$idx is odd ? ' class="odd"' : ''>{$idx} - {$row.title} и два тикета туДаблин</div>
{/foreach}
И т.п.
Документация Fenom.
Іван Клімчук
17 февраля 2017, 10:18
3
+1
Довольно просто, если в целом.
Вот пример моей формы с фильтрами и кнопкой.
<form action="" method="post" id="mse2_filters">
    {if $filters != 'Нечего фильтровать'}
        {$filters}
        <div class="filter">
            <main>
                <div class="txt-center">
                    <button type="reset" class="button-outline">Сбросить фильтры</button>
                    <button type="submit" class="hidden">[[%mse2_submit]]</button>
                </div>
            </main>
        </div>
    {else}
        <div class="centered">
            <p>
                
                {$filters}
            </p>
        </div>
    {/if}
</form>
Александр Быковский
09 декабря 2016, 09:27
1
0
Это было бы здорово, куда пройти за помощью?) Чтобы ветку не захламлять
Андрей
25 декабря 2015, 17:55
1
+1
Да, не вопрос. Но отмечу, что выкладываю решение работающее, но без правок, которые предложил Сергей Шлоков.
Начнем с разметки. Используем стандартную разметку модального окна на Bootstrap 3.

<div id="mymodal" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h4 class="modal-title" id="modal-title"></h4>
      </div>
      <div class="modal-body" id="content">
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
Скрипт JS, размещаем на странице, на которой выводятся анонсы статей или в шаблон.
$(document).on('click','a.read-more',function(e){
	e.preventDefault();
	var id = $(this).data('id') || 0;
	$("#content").load("/assets/ajax.php",{action:"getContent",id:id}, function(response){
		if (response) {
			var data = eval("(" + response + ")");
			$('#content').html(data.content);
			$('#modal-title').html(data.pagetitle);
			$("#mymodal").modal('show');
		}
	});
});
И теперь привожу код файла коннектора запросов ajax.php, который необходимо закинуть в папку assets.

<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest' || empty($_REQUEST['action'])) {exit();}

$action = $_REQUEST['action'];

define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)).'/index.php';

$modx->getService('error','error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;

$output = '';
switch ($action) {
    case 'getContent':
        $id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
        if (empty($id)) {
            exit();
        };

        $object = $modx->getObject('modResource',$id);
	$output = array();
        $output['content'] = $object->get('content');
	$output['pagetitle'] = $object->get('pagetitle');
	$output = json_encode($output);
        $maxIterations= (integer) $modx->getOption('parser_max_iterations', null, 10);
        $modx->getParser()->processElementTags('', $output, false, false, '[[', ']]', array(), $maxIterations);
        $modx->getParser()->processElementTags('', $output, true, true, '[[', ']]', array(), $maxIterations);
}

@session_write_close();
exit($output);
Павел Гвоздь
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;
	
}
Андрей
21 марта 2015, 16:31
8
+1
Ну вот как-то так набросал на скорую руку. -)

Создал плагин, повесил на событие OnDocFormSave.

<?php
if ($modx->event->name == 'OnDocFormSave') {

	$parentIds = $modx->getParentIds($id, 4, array('context' => 'web'));   // Получаем id всех родителей ресурса
	$res = $modx->getObject('modResource',$id);
	$curAlias = $res->get('alias');   // Алиас текущего ресурса

	$cnt = count($parentIds);  // Количество родителей

	if($cnt > 2) { 

		$aliases = array();   // Массив для всех найденных алиасов

		foreach($parentIds as $v) {
			if($v == 22 || $v == 0) continue;  // Если родитель - контейнер Shop(22) или главный родитель (0) - пропускаем.

			$obj = $modx->getObject('modResource', $v);
			$alias = $obj->get('alias');
			$aliases[] = $alias;
		}

		$resource->set('uri', implode('/',array_reverse($aliases)) . '/' . $curAlias);

	} else {
		$resource->set('uri', $curAlias);
	}

	$resource->set('uri_override', true);
        $resource->save();

}
Можно еще добавить условие, чтобы урл, таким образом, формировался только для новых ресурсов. Мне пока не нужно.

if ($mode == 'new') {
    // код выше
}