25 января 2021, 01:24 Если так хочется использовать уникальный id, то записывайте его в pagetitle, поскольку это поле должно быть уникальным, как я уже говорил и делайте проверку, о которой я уже писал, не усложняйте. Я понимаю, что сейчас это не работает, но нужно искать ошибку, а не усложнять решение. Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 0
25 января 2021, 01:21 Так вот, для чего вы получали $docs. Это конечно ваш код, но на мой делетантский взгляд, такой подход нерационален. Вам нужно создать TV, в цикле его получать, преобразовывать в массив, проверять есть ли в массиве текущий id, если нет, то создавать ресурс и добавлять новый id в массив, массив преобразовывать а строку, строку записывать в tv и сохранять изменения. Вам не кажется что это избыточный путь? Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 0
25 января 2021, 01:09 Да можно, в принципе, но получить ресурс по TV сложнее. Где-то у вас ошибка, и вам нужно её найти. Выведите в лог входные данные и пришлите сюда, посмотрим. Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 0
25 января 2021, 00:57 Вообще-то должно работать. Проверьте что находится в $media['title'] и в $resource->get('pagetitle'), может там пробелы какие или спецсимволы или ещё что-то и значения не совпадают. Я в коде ошибки не вижу, а то что проверка должна работать это факт. Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 0
25 января 2021, 00:13 Насколько мне известно, платных компонентов которые решают эту проблему нет. Поэтому вариантов у вас немного 1. Ждать что-то кто-то, напишет решение, а оно будет сложным для неподготовленного человека, т.к. нужно будет кастомизировать админку, а это непросто, как по мне. 2. Написать своё дополнение. 3. Сделать этот функционал как отдельную страницу на фронте доступную только админу. Вопросы / Редактирование заказа в админке 5 0
25 января 2021, 00:02 Если у вас будет повторяться pagetitle, то modx будет ругаться, оно вам надо? Думаю, нет. А проверить элементарно. Если я правильно понял, $usersMedia['data'] содержит массив полей, из которых вы создаёте ресурс, значит надо в цикле делать прямой запрос в БД через newQuery, где в условии ставить pagetitle=$usersMedia['data'][поле которое помещается в заголовок ресурса]. Если запрос вернёт хотя бы одно значение значит, такой ресурс уже есть и надо его либо обновить, либо пропустить и продолжить выполнение цикла. Как сделать запрос в БД подскажет Гугл ключевые слова modx xpdo sql. Ну а дальше уже всё как сейчас. Либо можно поступить проще, но если ресурсов много, то это может быть неоптимальным решением с точки зрения потребления ресурсов, просто попытаться получить объект $resource=$modx->getObject ('modResource', array('pagetitle'=>$usersMedia['data']['fieldname'])); if(!$resource){ //Создаём новый ресурс } <code> Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 +1 1
24 января 2021, 23:52 Думаю это лишнее, в конце концов, тут не курсы по программированию, а форум. Но если @Павел Бигель расскажет подробнее в чём плюсы его варианта, то это будет здорово. Пока я вижу только один — не нужно ничего изобретать, можно использовать как есть. Для разработчиков / [СДЕЛАЙ САМ] Поиск на сайте по-быстрому 31 0
24 января 2021, 21:27 Так $idpost содержит всего одно значение и это всегда значение предыдущей страницы, т.е. вероятность того, что у вас подряд идут два одинаковых id крайне мала. Далее, зачем вообще вам idpost, если гораздо логичнее перед добавлением нового ресурса проверять есть ли ресурс с таким pagetitle и если есть, то не добавлять? И getCollection лучше заменить на getIterator так как вам все объекты разом не нужны. И ещё, чистить кеш всего сайта в цикле не кажется мне хорошей идеей. Вопросы / MODX REVO API как при добавлении ресурсов из массива пропустить дубликаты? 39 0
23 января 2021, 19:58 Господа, не ссортесь, право слово программирование штука гибкая и у задачи может быть много решений, в какой-то ситуации лучше одно решение, в какой-то другое. getCollection кушает много памяти это факт, но если ресурсов немного, то данное обстоятельство некритично. Хотя я склоняюсь на сторону Артёма использование процессора сложновато и плохо вписывается в понятие «по-быстрому», я сам новичок и писал для новичков, Артём подсказал, где поправить, чтобы было быстрее и безопаснее получился, на мой взгляд вполне простой и понятный код, неуниверсальный конечно, но такая задача и не ставилась. Для разработчиков / [СДЕЛАЙ САМ] Поиск на сайте по-быстрому 31 0
23 января 2021, 19:37 Таки согласен, см. в-третьих. Постараюсь написать и такой вариант. Хотя я тот ещё любитель ООП)) Для разработчиков / [СДЕЛАЙ САМ] Поиск на сайте по-быстрому 31 0
23 января 2021, 19:24 А ошибки в консоли браузера есть? Готовые решения / [СДЕЛАЙ САМ] Личный кабинет своими руками. Редактирование персональных данных. 13 0
23 января 2021, 19:23 Во-первых, мне лично не очень понятно как и что я могу передать в этот процессор и что он мне вернёт, где можно почитать как с ним работать? Во-вторых, зачем мне поиск по TV, чанкам, сниппетам и пользователям, это избыточный функционал для моей задачи. В-третьих, я не учел что такой процессор существует. В-четвёртых, для саморазвития полезно изобрести велосипед другой, в конце концов я никого на нём ездить не заставляю:-) Для разработчиков / [СДЕЛАЙ САМ] Поиск на сайте по-быстрому 31 0
23 января 2021, 18:58 Валидатор у вас странный. Он данные берёт из базы, а должен с фронта. Я бы проверял $_FILES на количество файлов. Вопросы / Tickets позволяет пользователю отправить тикет без прикрепленных фото 6 0
23 января 2021, 13:30 Ну в вашем случае достаточно в случае изменения селекта ставить в скрытое поле 1 если что-то выбрано и 0 если не выбрано. Вопросы / Проверка мультиполя на заполненность 7 0
23 января 2021, 13:19 Тогда отдельное скрытое поле Вопросы / Проверка мультиполя на заполненность 7 0
23 января 2021, 12:59 вот так languages[]:requiredНо есть одно НО, ошибку всё равно не покажет потому что js ругается на селектор с []. В таких случаях обычно делают скрытое поле и проверяют его. Вопросы / Проверка мультиполя на заполненность 7 0
23 января 2021, 12:34 Давайте так, кусок кода который первым вы вставили, загружает фото в профиль пользователя и к Tickets отношения не имеет. Второй кусок кода, проверят сколько файлов уже было загружено к тикету. Компонент Tickets насколько мне известно не генерирует системных событий, т.е. плагин написать как minishop2 не получится, придётся править исходники. Я бы сделал копию файла assets/components/tickets/js/web/default.js, изменил системную настройку tickets.frontend_js и на 265 строке перед отправкой формы вставил бы проверку if( document.getElementById('files').files.length < 3){ Tickets.Message.error('Файлов должно быть не меньше 3'); return false; } Готовые решения / [СДЕЛАЙ САМ] Личный кабинет своими руками. Редактирование персональных данных. 13 0
23 января 2021, 11:39 Так у вас же написано Ошибка при загрузке файлов, т.е. на сервер как бы попадает 3 файла, но с загрузкой одного из них какая-то проблема. Т.е. вам нужно сначала делать проверку на количество, а потом загружать. Готовые решения / [СДЕЛАЙ САМ] Личный кабинет своими руками. Редактирование персональных данных. 13 0
23 января 2021, 11:11 <?php if(!$order_id){return false;} $pdoTools = $modx->getService('pdoTools'); $orderFields = array('id','num', 'createdon', 'updatedon', 'cart_cost', 'delivery_cost', 'comment', 'status', 'cost'); $orderProductFields = array('id','product_id', 'name', 'count', 'price', 'cost', 'options'); $addressFields = array('city', 'street', 'receiver', 'phone', 'comment'); $output = array( 'meta' => [], 'address' => [], 'products' => [] ); $order = $modx->getObject('msOrder', $order_id); if($order){ //заполняем массив основных данных заказа for($i = 0; $i < count($orderFields); $i++){ $output['meta'][$orderFields[$i]] = $order->get($orderFields[$i]); } //вычисляем срок выполнения заказа $output['meta']['duration'] = ceil($output['meta']['cost'] / $modx->getOption('base_cost')); //заполняем адрес и дополнительные данные $address = $order->getOne('Address'); $properties = $address->get('properties'); for($i = 0; $i < count($addressFields); $i++){ if($addressFields[$i] != 'properties'){ $output['address'][$addressFields[$i]] = $address->get($addressFields[$i]); }else{ foreach($properties as $name => $prop){ $output['address'][$name] = $prop; } } } //заполняем продукты $products = $order->getMany('Products'); if($products){ foreach($products as $key => $product){ for($i = 0; $i < count($orderProductFields); $i++){ $output['products'][$key][$orderProductFields[$i]] = $product->get($orderProductFields[$i]); } } } //$modx->log(1, 'OUTPUT getUserOrder ' . print_r($output, 1)); if($tpl){ return $pdoTools->getChunk($tpl, $output); } //$modx->log(1, print_r($output,1)); return $output; }else{ return false; } ФРОНТ {set $order = '!getOrder' | snippet:[ 'order_id' => $.get.order_id ]} {if $order} <p class="h-6"><span class="text-orange">Номер заказа:</span> {$order['meta']['num']}</p> <p class="h-6"><span class="text-orange">Дата заказа:</span> {$order['meta']['createdon'] | date: 'd.m.Y H:i:s'}</p> <p class="h-6"><span class="text-orange">Имя заказчика:</span> {$order['address']['receiver']}</p> {if $_modx->isAuthenticated('mgr') || $.get.admin} <p class="h-6"><span class="text-orange">Телефон заказчика:</span> <a class="service-link" href="tel:{$order['address']['phone'] | replace:'-':'' }">{$order['address']['phone'] | replace:'-':'' }</a></p> {/if} <p class="h-6"><span class="text-orange">Общая стоимость:</span> <span class="jsTotalOrderCost">{$order['meta']['cost']}</span> руб.</p> <p class="h-6"><span class="text-orange">Срок выполнения:</span> <span class="jsOrderDuration">{$order['meta']['duration']}</span> дн.</p> <p class="h-6 mb-0"><span class="text-orange">Перечень включенных в состав услуг <small class="small">(в стоимость услуг входит стоимость платных дополнений)</small>:</span></p> {if $_modx->isAuthenticated('mgr') || $.get.admin} <div class="pl-0" id="productList"> {set $i = 1} {foreach $order['products'] as $key => $product} {set $description = $product['product_id'] | resource: 'desc'} {set $introtext = $product['product_id'] | resource: 'introtext'} {set $add_cost = $product['product_id'] | resource: 'add_cost'} {set $weight = $product['product_id'] | resource: 'weight'} {$_modx->parseChunk('@FILE chunks/shop/editOrderProduct.html', [ 'description' => $product['options']['desc']?:$description, 'introtexxt' => $introtext, 'index' => $i, 'add_cost' => $add_cost, 'price' => $product['price'], 'weight' => $weight, 'count' => $product['count'], 'name' => $product['options']['name']?:$product['name'], 'cost' => $product['cost'], 'id' => $product['id'], 'options' => $product['options'], 'order_id' => $.get.order_id, 'total_cost' => $order['meta']['cost'], 'product_id' => $product['product_id'] ])} {set $i = $i + 1} {/foreach} </div> <form class="row py-3 jsProductRow border-gray-bottom jsAddForm"> <p class="h-5">Добавить услугу</p> <input type="hidden" name="weight" value="1"> <input type="hidden" name="order_id" value="{$.get.order_id}"> <input type="hidden" name="total_cost" value="{$order['meta']['cost']}"> <input type="hidden" name="action" value="editOrder"> <input type="hidden" name="product_id" value="130"> <div class="col-lg-7 col-md-5 col-6 d-flex flex-column justify-content-center align-items-start"> <label class="label-text par mb-0 w-100"> <input type="text" class="input pr-1" name="name" placeholder="{130 | resource: 'pagetitle'}" value="" required> </label> </div> <div class="col-lg-1 col-md-1 col-6 d-flex justify-content-center align-items-center"> <label class="label-text par mb-0"> <input type="number" class="input pr-1" min="1" name="count" value="1"> </label> </div> <div class="col-lg-2 col-md-3 col-6 d-flex justify-content-center align-items-center"> <label class="label-text par mb-0"> <input type="text" class="input pr-1" name="price" placeholder="Цена" value="" required> </label> </div> <div class="col-lg-2 col-md-3 col-6 d-flex justify-content-center align-items-center"> <button class="btn btn-orange btn-cart" type="submit"> <i class="fa fa-cart-plus"></i> </button> </div> <div class="col-12 order-5 mt-3"> <label class="label-text par mb-0"> <textarea name="options[desc]" class="textarea w-100" rows="4" placeholder="Описание"></textarea> </label> </div> </form> {else} <ul class="pl-0"> {foreach $order['products'] as $key => $product} {set $description = $product['product_id'] | resource: 'description'} {set $introtext = $product['product_id'] | resource: 'introtext'} {set $add_cost = $product['product_id'] | resource: 'add_cost'} <li class="row py-3 jsProductRow border-gray-bottom"> <input type="hidden" name="id" value="{$id}"> <div class="col-lg-7 col-md-5 col-6 d-flex flex-column justify-content-center align-items-start"> <span class="par service-link mb-3">{$product['options']['name']?:$product['name']}</span> <small class="small">{$product['options']['desc']?:$description}</small> {if $add_cost} <small class="small text-orange">Добавочная стоимость: {$add_cost} руб.</small> {/if} </div> <div class="col-lg-1 col-md-1 col-6 d-flex justify-content-center align-items-center"> <span class="price text-orange h-6">{$product['count']} шт.</span> </div> <div class="col-lg-2 col-md-3 col-6 d-flex justify-content-center align-items-center"> <span class="text-orange h-6">{$product['price']} руб.</span> </div> <div class="col-lg-2 col-md-3 col-6 d-flex justify-content-center align-items-center"> <span class="text-orange h-6">{$product['cost']} руб.</span> </div> </li> {/foreach} </ul> {/if} {else} <p class="h-4 text-center">Заказ с id = {$.get.order_id} не существует в системе</p> {/if} <div class="row"> <div class="col-lg-3 offset-lg-3 col-sm-6 mt-3"> <div class="btn-wrap"> <a href="/" class="btn btn-no-bg w-100">На Главную</a> </div> </div> <div class="col-lg-3 col-sm-6 mt-3"> <div class="btn-wrap"> <a href="{9 | url}" class="btn btn-no-bg w-100">К Услугам</a> </div> </div> </div> Вопросы / Сделать страницы заказа доступными для пользователя с правами администратор 11 +1
23 января 2021, 11:06 До первого обновления minishop2 Вопросы / Сделать страницы заказа доступными для пользователя с правами администратор 11 0
UiCMPGenerator дополнение для создания пакетов Ближе к сентябрю, основная загвоздка это создание нормальной документации и видео обзора, а так пакет как бы уже готов
Личный кабинет на Sendit - не удается сбросить пароль Хм, в массиве поле extended приходит пустым, временного пароля там нет. Сам тестовый юзер изначально был зареген в группу Users с правами доступа в личный кабинет (по обычной инстр...
Checkbox для модального окна Они не отключены, они платные, чтобы писали только те, кому действительно очень надо. Когда бесплатно люди начинают думать, что я им должен.
[SendIt 2.6.0] Анализ поведения пользователя для защиты от спама (невидимая капча)... Здравствуйте. Делаю личный кабинет на Sendit и со сбросом пароля возникли проблемы. Можете подсказать, в чем ошибка? Список вопросов в одноименном разделе на modx.pro пока пуст, и,...
Minishop + честный знак (продажа маркированной продукции) В нашем случае мы решили убрать всю логику по маркировке сайта.
MiniShop3 - Не выводятся товары дополнительных категорий @SYAN ваша указанная проблема исправлена еще до версии 1.2.3 @Павлик Мышкин завел: github.com/modx-pro/MiniShop3/issues/480 github.com/modx-pro/MiniShop3/issues/481Исправим в б...
MobileDetect 2.0.0-pl функция "планшеты как стандартные браузеры не работает" в 2.1.0-pl баг исправлен
msImportExport не сохраняет родителя по умолчанию Компонент не понимает кирилические домены при загрузку фото. пример: Error download. Url : https://антаресдвери.рф/upload/iblock/a50/a50b2ef45305a3c18f6e298f1e134880.jpg. Message...
1. Ждать что-то кто-то, напишет решение, а оно будет сложным для неподготовленного человека, т.к. нужно будет кастомизировать админку, а это непросто, как по мне.
2. Написать своё дополнение.
3. Сделать этот функционал как отдельную страницу на фронте доступную только админу.
Во-вторых, зачем мне поиск по TV, чанкам, сниппетам и пользователям, это избыточный функционал для моей задачи.
В-третьих, я не учел что такой процессор существует.
В-четвёртых, для саморазвития полезно изобрести велосипед другой, в конце концов я никого на нём ездить не заставляю:-)
Но есть одно НО, ошибку всё равно не покажет потому что js ругается на селектор с [].
В таких случаях обычно делают скрытое поле и проверяют его.
ФРОНТ