[alpha] Реализация магазинов пользователей
        Все выстроиол на поле weight (ниразу им не пользовался по назначению).
Смысл работы:
Пользователь регистрируется и попадает в группу usershop.
Есть страница создания товара, на ней выводится usCreateProduct, при создании сниппет получает id пользователя и записывает его в weight.
Внутри товара выводится сниппет usEditProduct который проверяет пользователя на наличие группы usershop и поле weight на соответствие id пользователя.
На странице заказов выводится usOrders который получает все заказы, в которых ищет weight=id пользователя (тот, что в группе usershop) и выводит заказанные товары ну и все поля заказа.
Реализация не сама лучшая, потихоньку пилю.
Код minishop2 не затронут, задействовано только поле weight
#Сниппет: usCreateProduct — требуется ajaxform.
#Чанк: tpl.usCreateProduct.form
Использование:
#Сниппет: usEditProduct
#Сниппет: usEditProductForm
#Чанк: tpl.usEditProduct.form
Использование — редактирование товара доступно по ссылке site.ru/страница_вывода_сниппета?id=67, где id = id товара в системе
#Сниппет: usOrders
#Чанк tpl.usOrder.row
Использование
В планах:
Переписать создание и редактирование, они уж очень кривые.
Прикрутить галерею при создании товара.
Ввести возможность продавцу (пользователю из группы usershop) менять статусы заказа (отправлен/отменен).
Реализовать отслеживание действий продавца в компоненте (при изменении товара не публиковать его, выслать сообщение менеджеру что товар изменен и его необходимо проверить и прочее).
Платное размещение на плошадке (с msProfile).
Вывод суммы продаж в кабинете продавца.
Вывод всех клиентов продавца с возможность экспорта.
Желающих принять участие — милости прошу.
Update 17.07.2014: Обновил снипеты и чанки создания и редактиования, более божеский вид и защита от других групп.
    
    
                                                                                
            Смысл работы:
Пользователь регистрируется и попадает в группу usershop.
Есть страница создания товара, на ней выводится usCreateProduct, при создании сниппет получает id пользователя и записывает его в weight.
Внутри товара выводится сниппет usEditProduct который проверяет пользователя на наличие группы usershop и поле weight на соответствие id пользователя.
На странице заказов выводится usOrders который получает все заказы, в которых ищет weight=id пользователя (тот, что в группе usershop) и выводит заказанные товары ну и все поля заказа.
Реализация не сама лучшая, потихоньку пилю.
Код minishop2 не затронут, задействовано только поле weight
#Сниппет: usCreateProduct — требуется ajaxform.
<?php
if($modx->user->isMember('usershop')){
	if (empty($_POST['title']) || empty($_POST['price']) || empty($_POST['parent'])) {
		return $AjaxForm->error('Вы не заполнили поле');
	}else {
		$response = $modx->runProcessor('resource/create', array(
		  'class_key' => 'msProduct',
		  'pagetitle' => $_POST['title'],
		  'article' => $_POST['article'],
		  'introtext' => $_POST['introtext'],
		  'content' => $_POST['content'],
		  'template' => 2,
		  'published' => 0,
		  'parent' => $_POST['parent'],
		  'price' => $_POST['price'],
		  'old_price' => $_POST['price_old'],
		  'weight' => $modx->user->get('id')
		));
		if ($response->isError()) {
			return $modx->error->failure($response->getMessage());
		}
		
		$modx->cacheManager->refresh();
		return $AjaxForm->success('Товар добавлен');
	
	 }
}else{
	 return $AjaxForm->error('Нет доступа к созданию товара');
}#Чанк: tpl.usCreateProduct.form
<form action="" method="post" class="usCreateProduct">
	<div>
		<label for="title">Название товара</label>
		<input type="text" name="title" value=""/>
		<span class="error error_title">[[+fi.error.title]]</span>
	</div>
	
	
	<div>
		<label for="article">Артикул</label>
		<input type="text" name="article" value=""/>
	</div>
	<div>
		<label for="price">Цена</label>
		<input type="number" name="price" value=""/>
		<span class="error error_price">[[+fi.error.price]]</span>
	</div>
	
	<div>
		<label for="price_old">Старая цена</label>
		<input type="number" name="price_old" value=""/>
	</div>
	
	<div>
		<label for="introtext">Краткое описание</label>
		<input type="text" name="introtext" value=""/>
	</div>
	
	<div>
		<label for="content">Описание</label>
		<input type="text" name="content" value=""/>
	</div>
	
	<div style="width:100%;">
	 	<select name="parent" value="">
			<option disabled="disabled" selected> Выберите категорию </option>
			
			[[pdoResources?
   			 &parents=`0`
			 &where=`{"class_key":"msCategory"}`
			 &tpl=`@INLINE <option value="[[+id]]">[[+pagetitle]]</option>`
			]]
		</select>
	</div>
	
	
	
	<div class="control-group">
		<div class="controls">
			<button type="reset" class="btn">[[%af_reset]]</button>
			<button type="submit" class="btn btn-primary">[[%af_submit]]</button>
		</div>
	</div>
	
</form>Использование:
[[!AjaxForm? &snippet=`usCreateProduct` &form=`tpl.usCreateProduct.form`]]#Сниппет: usEditProduct
<?php
$id = $_GET['id'];
$msProduct = $modx->getObject('msProduct', $id);
$msProductData = $modx->getObject('msProductData', $id);
if($msProductData->weight == $modx->user->get('id')){
	if($form == '1'){
		$output = $modx->runSnippet('AjaxForm',array(
			'snippet' => 'usEditProductForm',
			'form' => 'tpl.usEditProduct.form',
			'successMessage' => 'test'
		));
		return $output;
	}else{
		$modx->setPlaceholders(array(
			'pagetitle' => $msProduct->pagetitle,
			'id' => $id,
			'article' => $msProductData->article,
			'price' => $msProductData->price,
			'price_old' => $msProductData->old_price,
			'introtext' => $msProduct->introtext,
			'content' => $msProduct->content
			),'product.');
		}
	
}else{
	return 'Вы не являетесь владельцем данного товара.';
}#Сниппет: usEditProductForm
<?php
$product_id = $_POST['product_id'];
if (empty($_POST['title'])){
	return $AjaxForm->error('Ошибки в форме', array('title' => 'Не задано название товара'));
}else{
	$msProduct = $modx->getObject('msProduct', $product_id);
	$msProductData = $modx->getObject('msProductData', $product_id);
	if($msProductData->weight == $modx->user->get('id')){ 
  		$msProduct->set('pagetitle',$_POST['title']);
		$msProduct->set('article',$_POST['article']);
		$msProduct->set('price',$_POST['price']);
		$msProduct->set('old_price',$_POST['price_old']);
		$msProduct->set('introtext',$_POST['introtext']);
		$msProduct->set('content',$_POST['content']);
		if ($msProduct->save()) { $modx->cacheManager->clearCache(); return $AjaxForm->success('Товар изменен');}
  	}else{
		return $AjaxForm->error('Вы пытаетесь изменить товар который Вам не принадлежит!');
	}
}#Чанк: tpl.usEditProduct.form
[[!usEditProduct]]
<form action="" method="post" class="usEditProduct">
	<input type="hidden" name="product_id" value="[[+product.id]]">
	<div>
		<label for="title">Название товара</label>
		<input type="text" name="title" value="[[+product.pagetitle]]"/>
		<span class="error error_title">[[+fi.error.title]]</span>
	</div>
	
	
	<div>
		<label for="article">Артикул</label>
		<input type="text" name="article" value="[[+product.article]]"/>
	</div>
	
	<div>
		<label for="price">Цена</label>
		<input type="number" name="price" value="[[+product.price]]"/>
		<span class="error error_price">[[+fi.error.price]]</span>
	</div>
	
	<div>
		<label for="price_old">Старая цена</label>
		<input type="number" name="price_old" value="[[+product.price_old]]"/>
	</div>
	
	<div>
		<label for="introtext">Краткое описание</label>
		<input type="text" name="introtext" value="[[+product.introtext]]"/>
	</div>
	
	<div>
		<label for="content">Описание</label>
		<input type="text" name="content" value="[[+product.content]]"/>
	</div>
	
	
	
	
	
	<div class="control-group">
		<div class="controls">
			<button type="reset" class="btn">[[%af_reset]]</button>
			<button type="submit" class="btn btn-primary">[[%af_submit]]</button>
		</div>
	</div>
	
</form>Использование — редактирование товара доступно по ссылке site.ru/страница_вывода_сниппета?id=67, где id = id товара в системе
[[!usEditProduct? &form=`1`]]#Сниппет: usOrders
<?php
$owner = $modx->user->get('id');
foreach($modx->getIterator('msOrder') as $orders){
	foreach($modx->getIterator('msOrderProduct', array('order_id' => $orders->id)) as $products){
		foreach($modx->getIterator('msProductData', array('id' => $products->product_id, 'weight' => $owner)) as $product){ 
			$order = $modx->getObject('msOrderAddress', array('id' => $orders->id));
			$payment = $modx->getObject('msPayment', array('id' => $orders->payment));
			$delivery = $modx->getObject('msDelivery', array('id' => $orders->delivery));
			$status = $modx->getObject('msOrderStatus', array('id' => $orders->status));
			$fields = array(
				'payment'=>$payment->name,
				'delivery'=>$delivery->name,
				'delivery_cost'=>$orders->delivery_cost,
				'reciever'=>$order->receiver,
				'phone'=>$order->phone,
				'city'=>$order->city,
				'street'=>$order->street,
				'building'=>$order->building,
				'room'=>$order->room,
				'comment'=>$order->comment,
				// товар
				'order'=>$order->id,
				'product'=>$modx->getObject('msProduct', $product->id)->get('pagetitle'),
				'count'=>$products->count,
				'product_link'=>$modx->getObject('msProduct', $product->id)->get('uri'),
				'date'=>$order->createdon,
				'id'=>$product->id,
				'price'=>$products->price,
				'owner'=>$product->weight,
				'status'=>$status->name
			);
			$output .= $modx->getChunk('tpl.usOrder.row',$fields);
		}
	}
}
echo $output;#Чанк tpl.usOrder.row
<tr class="order number[[+order]]">
	<td>[[+date]]</td>
	<td><a href="[[+product_link]]" target="_blank">[[+product]]</a> x[[+count]]</td>
	<td>[[+price]]</td>
	<td>[[+status]]</td>
</tr>
<tr class="order_info number[[+order]]">
	<td colspan="4">
	Оплата: [[+payment]]
	Доставка: [[+delivery]] / [[+delivery_cost]]
    Адрес: [[+city]], [[+street]], [[+building]], [[+room]]
	Имя: [[+reciever]]
	Телефон: [[+phone]]
	Коментарий: [[+comment]]
	</td>
</tr>Использование
<table class="usOrders" border="1" >
	<tr class="head">
		<th>Дата заказа</th>
		<th>Товар</th>
		<th>Цена</th>
		<th>Статус</th>
         </tr>
        [[!usOrders]]
</table>В планах:
Переписать создание и редактирование, они уж очень кривые.
Прикрутить галерею при создании товара.
Ввести возможность продавцу (пользователю из группы usershop) менять статусы заказа (отправлен/отменен).
Реализовать отслеживание действий продавца в компоненте (при изменении товара не публиковать его, выслать сообщение менеджеру что товар изменен и его необходимо проверить и прочее).
Платное размещение на плошадке (с msProfile).
Вывод суммы продаж в кабинете продавца.
Вывод всех клиентов продавца с возможность экспорта.
Желающих принять участие — милости прошу.
Update 17.07.2014: Обновил снипеты и чанки создания и редактиования, более божеский вид и защита от других групп.
Комментарии: 7
                Обновил снипеты и чанки создания и редактирования, более божеский вид и защита от других групп.            
                    
                Несколько дней рылся по докам и так и не нашел. как сделать загрузку изображений минишопа?
Нашел только единственный выход:
при создании грузить файл и вставлять ссылку на загруженный файл в базу.
Но при создании у товара нету id, непонятно как разбить несколько фоток.
Да и грузить фотки только после сохранения ресурса не очень хорошо…
Есть у кого идеи?
                    Нашел только единственный выход:
при создании грузить файл и вставлять ссылку на загруженный файл в базу.
Но при создании у товара нету id, непонятно как разбить несколько фоток.
Да и грузить фотки только после сохранения ресурса не очень хорошо…
Есть у кого идеи?
                Получилось?            
                    
                По поводу порядка загрузки изображений — вроде как, все уже придумано:
— грузить выбранные изображения в папку «0» (в выбранном источнике файлов), после чего при сохранении/создания ресурса, после присвоения ему Id — менять название папки и прописывать соответствующие записи в базу.
Альтернатив, насколько я знаю — нет (из-за этой специфики и ms/ms2gallery становится доступна в административной части только после создания ресурса). Готовых решений тоже.
                    — грузить выбранные изображения в папку «0» (в выбранном источнике файлов), после чего при сохранении/создания ресурса, после присвоения ему Id — менять название папки и прописывать соответствующие записи в базу.
Альтернатив, насколько я знаю — нет (из-за этой специфики и ms/ms2gallery становится доступна в административной части только после создания ресурса). Готовых решений тоже.
                там не работает загрузка в галерею ms2, связывался с парнем, у нечего через амазон вроде все идет.            
                    
                Сейчас с ним связался, может быть доработает до нужного состояния.            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.