[alpha] Реализация магазинов пользователей

Все выстроиол на поле weight (ниразу им не пользовался по назначению).

Смысл работы:

Пользователь регистрируется и попадает в группу 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: Обновил снипеты и чанки создания и редактиования, более божеский вид и защита от других групп.
but1head
16 июля 2014, 21:34
modx.pro
6
2 308
+3

Комментарии: 7

but1head
17 июля 2014, 22:40
0
Обновил снипеты и чанки создания и редактирования, более божеский вид и защита от других групп.
    but1head
    22 июля 2014, 01:53
    1
    0
    Несколько дней рылся по докам и так и не нашел. как сделать загрузку изображений минишопа?
    Нашел только единственный выход:
    при создании грузить файл и вставлять ссылку на загруженный файл в базу.
    Но при создании у товара нету id, непонятно как разбить несколько фоток.
    Да и грузить фотки только после сохранения ресурса не очень хорошо…
    Есть у кого идеи?
      Wassi Wassinen
      03 февраля 2015, 20:00
      0
      Получилось?
        Максим Кузнецов
        03 февраля 2015, 22:15
        0
        По поводу порядка загрузки изображений — вроде как, все уже придумано:
        — грузить выбранные изображения в папку «0» (в выбранном источнике файлов), после чего при сохранении/создания ресурса, после присвоения ему Id — менять название папки и прописывать соответствующие записи в базу.

        Альтернатив, насколько я знаю — нет (из-за этой специфики и ms/ms2gallery становится доступна в административной части только после создания ресурса). Готовых решений тоже.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      7