Вывод заказов для Minishop2
Давно использую MODX Revo, но в основном для небольших сайтов. А сейчас решил сделать на нём интернет-магазин. Захотелось сделать на сайте личный кабинет покупателя, где он сможет просматривать свои заказы. Начал искать и не нашёл ни одного решения этого вопроса (может плохо искал?!).
Странно. В итоге написал свой велосипед — сниппет и чанк в котором выводится содержимое.
Сниппет getOrders:
Решение на сказать что готовое, но более подходящего раздела для темы нет.
На нужной странице вызываем сниппет:
Если есть советы по усовершенствованию, то пишите.
ЗЫ: в комментариях дали совет по переделке — отделить логику от отображения и переделать c SQL на xPDO. Первое сделаю обязательно, а вот второе под вопросом — не вижу в этом смысла.
Странно. В итоге написал свой велосипед — сниппет и чанк в котором выводится содержимое.
Сниппет getOrders:
<?php
$user_id = $modx->user->get('id');
$chunkName = 'tpl.GetOrder.row';
$q = $modx->prepare("SELECT * FROM modx_ms2_orders WHERE user_id='$user_id' ORDER BY createdon");
$q->execute();
$orders = $q->fetchAll(PDO::FETCH_ASSOC);
if(count($orders)!=0){
foreach($orders as $order){
echo '<div class="row order">';
$order_id = $order[id];
$order_num = $order[num];
$order_status = $order[status];
$order_created = $order[createdon];
switch ($order_status){
case 1:
$order_status = '<span class="badge">Новый</span>';break;
case 2:
$order_status = '<span class="badge green">Оплачен</span>';break;
case 3:
$order_status = '<span class="badge blue">Отправлен</span>';break;
case 4:
$order_status = '<span class="badge red">Отменён</span>';break;
};
echo '<div class="col-md-2 center" style="padding: 20px;">';
echo '<p>Заказ</p>'.$order_num.' от
<p>'.$order_created.'</p><p>'.$order_status.'</p>';
echo '</div>';
echo '<div class="col-md-10">';
$q = $modx->prepare("SELECT * FROM modx_ms2_order_products WHERE order_id='$order_id'");
$q->execute();
$products = $q->fetchAll(PDO::FETCH_ASSOC);
echo '<table class="table table-hover"><thead><tr><th>#</th><th>Фото</th><th>Арт.</th><th>Кол</th><th>Цена</th><th>Итого</th></tr></thead><tbody>';
$i = 0;
foreach($products as $product){
$i = $i + 1;
$product_id = $product[product_id];
$q = $modx->prepare("SELECT * FROM modx_ms2_products WHERE id='$product_id'");
$q->execute();
$product_data = $q->fetchAll(PDO::FETCH_ASSOC);
$fields = array(
'id'=>$product_id,
'num'=>$i,
'thumb'=>$product_data[0][thumb],
'article'=>$product_data[0][article],
'count'=>$product[count],
'price'=>$product[price],
'summa'=>$product[price]*$product[count]
);
echo $modx->getChunk('tpl.GetOrder.row',$fields);
};
echo '</tbody></table>';
echo '</div>';
echo '</div>';
};
} else {
echo '<p>У вас ещё не было заказов</p>';
};Чанк tpl.GetOrder.row:<tr>
<td>[[+num]]</td>
<td><a href="[[~[[+id]]]]"><img src="[[++site_url]][[+thumb:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]" width="100px"/></a></td>
<td><a href="[[~[[+id]]]]">[[+article]]</a></td>
<td>[[+count]]</td>
<td>[[+price]]</td>
<td>[[+summa]]</td>
</tr>На премию за изящество это решение не претендует, но вроде работает.Решение на сказать что готовое, но более подходящего раздела для темы нет.
На нужной странице вызываем сниппет:
[[!getOrders]]и всё.Если есть советы по усовершенствованию, то пишите.
ЗЫ: в комментариях дали совет по переделке — отделить логику от отображения и переделать c SQL на xPDO. Первое сделаю обязательно, а вот второе под вопросом — не вижу в этом смысла.
Комментарии: 38
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
bezumkin.ru/modx/minishop2/solutions/
Так и пиши.
Поправил заголовок, спасибо! Так действительно понятнее.
Ну или в другой раздел с решениями.
Alex Alex$options = json_decode($product['options'], true);
$color = $options['color'];
$size = $options['size'];
В массив $fields добавить:
'color'=>$color,
'size'=>$size
Alex AlexAlex AlexЧто то вроде этого:
Alex AlexА в целом за идею реализации спасибо.
Volgot And Co. LtdПавел Пустота, вам ++ за героизм — когда не зная ни одной строчки языков программирования смело пытаются что-то делать сами, respect. За это вам (и всем за компанию) в подарок ваш код вызова ордеров только в правильном виде
НИКОГДА НЕ ДЕЛАЙТЕ рекурсивных запросов к базам из циклов
A весь ваш код выкиньте в мусорную корзину, как можно скорее
p.s. хорошо что клиенты, некоторым из которых здесь платят ДЕНЬГИ, не видят то, что здесь происходит… )
pdoResources прекрасно справляется со своими функциями
Volgot And Co. Ltdp.s. старая советская шутка: «Если (if) человек дурак — он идет работать учителем, если же (else if) человек настолько дурак, что не может работать учителем — он идет работать учителем физкультуры»
p.p.s. по статье по ссылке могу лишь добавить "… а если человек инвалид, и не может работать учителем физкультуры, он идет работать учителем модикса"
Volgot And Co. LtdResource selection properties
These properties determine what resources will appear in the generated list.
Name Default Description
&parents Current resource Comma-separated list of parents, to find results. Set to 0 for unlimited, to +0 for the top level. If a parent id starts with a dash, it and its children are excluded from the query.
&depth 10 Search depth of child resources from parent in the Resource Tree.
&resources Comma-separated list of resources to add to the results. If the id of the resource starts with a hyphen, this resource is excluded from the query.
&context Limit the resources from the given context.
&where An array of additional selection parameters encoded JSON.
&showHidden 1 Show resources that are hidden in the menu.
&showUnpublished 0 Show unpublished resources.
&showDeleted 0 Show resources that have been marked as deleted.
&hideContainers 0 Exclude container resources, that is, resources with «isfolder = 1».
&select 0 A comma-separated list of fields to retrieve. You can specify a JSON string array, for example {«modResource»:«id,pagetitle,content»}.
&sortby pagetitle Any resource field for sorting, including TVs if the &includeTVs property is also set. You can specify a JSON string with an array of multiple fields, for example {«tvname»:«ASC», «pagetitle»:«DESC»}. To randomly sort use «RAND()».
&sortdir DESC Sort direction: Ascending or Descending.
&limit 10 Limit the number of results. You can use «0» for no limit.
&offset 0 Number of items to skip, from the beginning.
&first 1 Number of the first item of the output results.
&last Automatic, by the formula (total + first — 1) Number of the last item of the results.
&loadModels Comma-separated list of components whose model you need to download for building a query. Example: &loadModels=`ms2gallery,msearch2`.
&tvFilters List of filters on TV, delimited AND and OR. Separator specified parameter &tvFiltersOrDelimiter represents the logical OR condition thereon and conditions grouped primarily. Within each group, you can specify a list of values, separated &tvFiltersAndDelimiter. Search values can be performed in any particular TV, if it is provided «myTV == value», or in any «value». Sample call: &tvFilters=`filter2==one,filter1==bar%||filter1==foo`. Please note: The filter uses the LIKE operator and the "%" symbol is a metacharacter. This will search for the values for the resources that are located in the site_tmplvar_contentvalues table, not from the default settings of the TV.
&tvFiltersAndDelimiter "," Separator for conditional AND property &tvFilters.
&tvFiltersOrDelimiter "||" Separator for conditional OR property &tvFilters.
Template Properties
These properties specify the chunks that contain the templates to format the generated output.
Name Description
&returnIds Set to «1» to return a string with a list of resource ids, instead of complete results. All of the templates are ignored.
&tpl Name chunk for formatting the individual items. If not specified, the contents of the resource fields will be printed to the screen.
&tplFirst Name of the chunk to format the first item in the results.
&tplLast Name of the chunk to format the last item in the results.
&tplOdd Name of the chunk to format every odd-numbered item in the results.
&tplWrapper Chunk — wrapper, to wrap all results. Accepts one placeholder:[[+output]]. It does not work in conjunction with &toSeparatePlaceholders.
&wrapIfEmpty Includes outer chunk wrapper *&tplWrapper** even if there are no results.
&tplCondition Defines a field of the resource to evaluate against keys defined in the &conditionalTpls property.
&tplOperator Optional operator for comparison of the resource field &tplCondition with an array of values and in &conditionalTpls chunks.
&conditionalTpls A JSON object defining a map of field values and the associated tpl Chunks to use when the field defined by &tplCondition matches the value. The comparison operator is specified in &tplOperator. For operators such as isempty you can not use an array of keys.
&outputSeparator Optional string to separate the results.
Result Properties
These properties further define what data to fetch and how to display it.
Name Default Description
&fastMode 0 Quick mode for processing chunks. All raw tags (output modifiers, snippets, etc.) are removed.
&idx The starting number of iterations of the output.
&setTotal 0 Indicates if the total placeholder should be populated with a count of the results.
&totalVar total Name of the placeholder for storing the total number of results.
&includeContent 0 Indicates if the «content» field of each resource should be returned in the results.
&includeTVs Comma-separated list of Template Variable values that should be included in the placeholders available to each resource template. Example: «action,time» will produce the placeholders [[+tv.action]] and [[+tv.time]].
&prepareTVs «1», prepares all TVs specified in &includeTVs Comma-separated list of media source-dependant TV values to be prepared before output.
&processTVs Comma-separated list of TVs that should be processed according to their output options. If set to «1», all TV listed in &includeTVs will be processed.
&tvPrefix tv. Prefix TV property.
&scheme -1 Type of URL scheme, passed to modX::makeUrl(). See this for a list of valid options.
&useWeblinkUrl 0 Generate link to the weblink resource, not to the destination URL. NOTE: To get this properly working, be sure to use [[+link]] instead of [[~[[+id]]]] eg. [[+pagetitle]].
&toPlaceholder Save output to a placeholder with this name instead of displaying the output to the screen.
&toSeparatePlaceholders Each item will be displayed in a placeholder with a name starting with this value and ending with the sequential number starting from zero. For example, by specifying the property value «myPl», you'll get placeholders [[+myPl0]], [[+myPl1]] & etc.
&showLog 0 Show additional debugging information on the processing of the snippet only to logged-in Manager users.
Volgot And Co. Ltdпростите, вы когда утром бреетесь запускаете для этого ядерный реактор или просто бритву используете? ))
Volgot And Co. Ltd2. твой запрос ты не показал
3. мои клиенты сами не меняют ни префиксы, ни названия таблиц, сменят — обратятся и оплатят лишнюю работу, я не разрабатываю modx, я работаю с другими, более серьезными продуктами ))
4. 742 символа вместе с print_r и комментариями для дебилов? )))))))
5. ты мне предлагаешь написать аналог pdoTools? нахуя, если он уже написан? или использовать pdoTools? нахуя, если моя задача этого не требует?
К слову я не рекламировал и ничего не навязывал, я сказал что это «лучше» как минимум по тому, что в принципе не хорошо выходить из экосистемы на которой весь сайт написан. Но тебе же барану не объяснить, кроме тебя твоими проектами 100% никто не занимается. У тебя такие серьезные проекты, что позволяют писать там код без код ревью с логикой «Если надо будет поправить — заплатят мне — я поправлю», да-да охотно верю. Если что, лендинги и сайт для соседнего суши — бара, это не серьезные проекты.
Volgot And Co. Ltdhabr.com/post/199062/
p.s. слышь, дите из Нахичевани, мой профайл посмотри сначала, где я живу и работаю, где ты (у меня рядом «суши баров» нет, одни шотбулеры)
Volgot And Co. LtdУ меня в примере весь код, включая все чанки, сниппеты, дизайн, бакенд, фронтенд и пдо запросы в 5-и (пяти) строчках. Больше ничего нет и не требуется :)
Вы правы, вы слишком талантливы чтобы учить людей, а также чтобы что-то выкладывать на гитхаб или писать компоненты, не стоит вам этого делать
Volgot And Co. Ltdвставь $table_prefix -> SELECT * FROM $table_prefix_ms2_orders
а, вы настолько талантливы, что можете только критиковать то, что другие даром выкладывают? ))) поделитесь вашим примером, я вам его оплачу
зы если вы включите моск или купите очки, то заметите, что мой запрос использует pdo модикса, хотя я мог его сделать совсем напрямую через mysqli_connect() и даже вообще через shell exec(«sudo mysql ***») :D
Я это вижу, но это тут причем? К слову pdoTools как раз НЕ имспользует xpdo модикса
Volgot And Co. Ltdвам тут за каждую строчку рекламы платят? ))
личше этот свой кривой сайт починили бы, на котором даже ЛОГИНЫ из соцсетей НЕ РАБОТАЮТ )))))))))))
2) А я что то рекламирую? Или все в жизни упирается в деньги?)
Volgot And Co. LtdVolgot And Co. LtdVolgot And Co. LtdЧем вас не устраивает чистый php и чистые запросы к базе — потому что вы их не изучали и не знаете? )
И последний вопрос, на засыпку: КАКОЙ запрос к базе используют САМИ pdoResources и сам Modx?
Если я вам сейчас покажу, что сам Modx (и любой другой cms, framework, и даже facebook Цукерберга) и даже ваш pdoTools делает запрос к базе данных «напрямую» — вы спать сможете спокойно, или будете ворочаться? )))))))
Давайте процитируем самого товарища Безумкина, аффтара этого шедевра: «К сожалению, xPDO не может похвастаться скоростью вывода (как, наверное, вообще любая ORM), поэтому я попробовал совместить её плюсы с обычным PDO, добавить лучшую работу с чанками и сделать удобную библиотеку для MODX.
Основные особенности:
Быстрая работа с БД. Все запросы составляются на xPDO, а выбираются без объектов — на PDO» < — вау, ваш pdoResources использует МОЙ прямой «говнозапрос»? какая неожиданность ))
А терь посмотрим комментарии к вашему аффтару, который «дурачит простачков»:
«И вот опять вот эта ахинея… «Мое прелестное дополнение»…
Это не просто твое прелестное дополнение. Это самое великое из того, что ты сделал — самый великий блеф! Тебе по прежнему удается простачков дурачить тем, что ты офигенный компонент написал и много-много его дорабатываешь. И многие верят (не хватает же мозгов проверить). И главное — сколько уже ты на него из СимплДрима денег вытянул? :-) Ведь тебе оплачивается твое рабочее время
В общем, это никакая не замена xPDO (хорошо хоть давно уже перестал это говорить, понял, что ляпнул не подумавши). Это простой синтаксический сахар, при чем не просто сомнительный, а конкретно ничего под собой не имеющий»
habr.com/post/199062/
Так что, гуляй, Паша, с простачками ))
Про pdoTools. Просто его удобно юзать. Предсказуемость результатов и маловероятный шанс что вызов сломается. Если ты не понял, хлебушка кусочек.
Про твоё и Павла решение. Без токсика написать не? Сложно? Ай, как же я мог забыть, ты же программист 1000000$ в наносекунду. Так и быть, тебе можно (нет).