Здоров Александр

Здоров Александр

С нами с 31 октября 2015; Место в рейтинге пользователей: #76
Сергей Карпович
09 января 2021, 11:50
1
0
Как оказалось, что бы опция передавалась в корзину нужно ее выводить в товаре через
[[msOptions? &options=`measure`]]
Вариант с опциями мне в принципе не нравится, поэтому сделал все проще.
Создал обычную TV, вывел ее в товаре
[[*measure]]
и в корзине
{$product.id | resource : 'measure'}
Юрий
03 мая 2020, 14:56
1
0
1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).
Такой вариант не подходит требования были именно выводить все товары в категории с разбивкой по производителям.

Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами,
Так и поступил, если кому то понадобится забирайте.

Сниппет miniShopVendorsList
<?php

$output = '';
$categoryId = (int)$modx->getOption('category', $scriptProperties, -1);

if ($categoryId >= 0) {
  $categoryEntries = [];
  
  $categoriesQuery = $modx->newQuery('modResource');
  $categoriesQuery->where(array(
     'parent:IN' => array($categoryId),
     'deleted' => false,
     'hidemenu' => false,
     'published' => true,
  ));
  $categoriesResources = $modx->getCollection('modResource', $categoriesQuery);
  
  foreach ($categoriesResources as $categoryResource) {
    $categoryEntries[] = $categoryResource->get('id');
  }
  
  if (!empty($categoryEntries)) {
    $vendorsListQuery = $modx->query("SELECT id, name FROM modx_ms2_vendors");
    $vendorsListArray = $vendorsListQuery->fetchAll(PDO::FETCH_ASSOC);
    
    if (!empty($vendorsListArray)) {
      $tpl = $modx->getParser()->getElement('modChunk', 'miniShopVendorsProductsList');
      $tpl->setCacheable(false);
      
      foreach ($vendorsListArray as $vendorRow) {
        $vendorData = $vendorRow;
        $vendorData['id'] = (int) $vendorData['id'];
        
        $vendorId = $modx->quote($vendorData['id'], PDO::PARAM_INT);
        
        $vendorProductsQuery = $modx->query("SELECT id FROM modx_ms2_products WHERE vendor = $vendorId");
        $vendorProductsArray = $vendorProductsQuery->fetchAll(PDO::FETCH_ASSOC);
    
        foreach ($vendorProductsArray as $vendorProductRow) {
          $vendorProductId = (int) $vendorProductRow['id'];
          if (in_array($vendorProductId, $categoryEntries)) {
            $vendorData['productsList'][] = $vendorProductId;
          }
        }
        $vendorData['productsList'] = implode(', ', $vendorData['productsList']);
        
        if (!empty($vendorData['productsList'])) {
          $tpl->_processed = false;
          $output .= $tpl->process($vendorData);
        }
        
      }
      
    }
    
  }
  
}

return $output;
Вывод на странице
<div class="col-12">
  <h3>[[+name]]</h3> // Название бренда
</div>

// Вывод товаров этого бренда

[[!msProducts?
  &parents=`0`
  &resources=`[[+productsList]]`
  &tpl=`catalog_list`
]]
но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.
В данном примере товаров всего около 100 шт. в 6 категориях и 5-6 брендов. В итоге на одной странице не больше 10-20 товаров. Поэтому в этом примере обошлись без ajax подгрузки.

PS код писал не сам, помог знакомый программист. Код писался «на коленке» по быстрому, если есть предложения по оптимизации и улучшению welcome
SEQUEL.ONE
14 сентября 2019, 20:36
2
0
Сегодня удалось победить отправку почты из формы на reg.ru

Во-первых я настроил smtp сервер от Яндекса по мануалу modhost.pro/help/email
Во-вторых надо было настроить DNS. Тех. поддержка reg.ru в этом помогла:

В SPF-записи отсутствует ip-адрес хостинга:

site.com. 300 IN TXT «v=spf1 redirect=_spf.yandex.net»

Это ошибка связана с политикой DMARC. Вам необходимо добавить ip-адрес сервера хостинга 192.168.255.255 в SPF-запись. Она примет следующий вид:

v=spf1 ip4:192.168.255.255 redirect=_spf.yandex.net
Ну а в третьих проверить параметр emailTo, является ли введённый адрес реальным.
И да, очень помог компонент QuickEmail со сниппетом:

[[!QuickEmail?
    &to=`my-mail@mydomain.ru`
    &debug=`1`
]]
Павел Романов
15 июля 2019, 17:38
1
+1
Если в чанке, то так:
<img src="{if $parent | resource: 'pagetitle' == 'Брюки'}{$medium}{else}{$big}{/if}" alt="{$pagetitle}" title="{$pagetitle}"/>

Если на странице самого продукта, то так:
<img src="{if $_modx->resource.parent | resource: 'pagetitle' == 'Брюки'}{$medium}{else}{$big}{/if}" alt="{$pagetitle}" title="{$pagetitle}"/>
Баха Волков
04 марта 2019, 19:51
1
0
В чанке что-то типа:

[[+wrapper:notempty=`<li[[+classes]]>....`]]
Oleg
31 августа 2018, 09:38
1
0
Благодарю, то, что я ищу.

В сниппете по ссылке осуществляется поиск товара (msProduct), а как можно искать обычные ресурсы? Пробую сделать так, не выходит:
<?php
if (!empty($_REQUEST['query'])) {
    $query = htmlspecialchars(strip_tags(trim($_REQUEST['query'])));
    $resource = $modx->getObject('modResource', [
        'pagetitle' => $query,
        'deleted' => 0,
        'published' => 1,
        'context_key' => $modx->context->key,
    ]);
    if ($resource) {
        $modx->sendRedirect($resource->get('uri'));
    }
}
Наумов Алексей
29 августа 2018, 11:23
2
+1
Есть такое решение у меня:

1) Создаем TV changeTemplate и назначаем его категориям.
2) Создает плагин changeTemplate, на событие OnDocFormRender (код ниже)
3) Теперь в TV мы можем написать:
«2» — всем дочерним ресурсам будет назначен шаблон 2
«2,3» — первый уровень дочерних ресурсов будет с шаблоном 2, второй уровень и далее — с шаблоном 3
ну и т.д., «2,3,4»
4) Но данный плагин сработает на все, в том числе и на категории, а не только на товары, если это нужно исправить — внесите изменения в код.

<?php
/**
* =========================
* ChangeTemplate
* =========================
*
* Plugin for MODX Revolution
* Set which template is inherited by children 
* documents of a certain parent document
*
* Author:
* Marc Loehe (boundaryfunctions)
* marcloehe.de
*
* Modified by:
* Lorenzo Stanco <lorenzo.stanco@gmail.com>
* Lorenzostanco.com
*
* Usage:
*
* 1. Paste this as new plugin and connect it to system event
* 'OnDocFormRender'.
*
* 2. Assign a new TV 'changeTemplate' to each template
* for which you want to define the default children template.
*
* 3. Set the newly created TV to input type "Text" 
*
* 4. Open a document and in the 'changeTemplate' TV type a 
* comma separated list of template IDs.
*
* 5. Have fun!
*
*/
 
// Check Event
if ($modx->event->name == 'OnDocFormRender' && $mode == modSystemEvent::MODE_NEW) {
   
  $id = empty($_REQUEST['id']) ? false : $_REQUEST['id'];
  $id = empty($id) ? (empty($_REQUEST['parent']) ? false : $_REQUEST['parent']) : $_REQUEST['parent'];
  // Get current document ID
  if ($id) {
 
    // Document Chain
    $resources = array($id);
 
    // Get parent ID
    foreach ($modx->getParentIds($id, 10, array('context' => $_REQUEST['context_key'])) as $parentId) {
      if ($parentId) array_push($resources, $parentId);
    }
     
    // Search changeTemplate in the chain
    $level = 0;
    $childTemplates = array();
    foreach ($resources as $resourceId) {
      $resource = $modx->getObject('modResource', $resourceId);
      if ($childTemplatesTV = $resource->getTVValue('changeTemplate')) {
         
        // Create template array for each tree level
        $childTemplates = @explode(',', $childTemplatesTV);
        if (empty($childTemplates)) break;
        foreach ($childTemplates as $k => $v) $childTemplates[$k] = intval(trim($v));
         
        break;
 
      }
 
      $level++;
 
    }
 
    // Set template based on tree level
    if (!empty($childTemplates)) {
      $useTemplate = $childTemplates[$level];
      if (!empty($useTemplate)) {
        
        // Set default template
        if (isset($modx->controller)) {
          $modx->controller->setProperty('template', $useTemplate);
        } else { // modX < 2.2.0
          $_REQUEST['template'] = $useTemplate;
        }
 
      }
    }
 
  }
 
}
Prihod
20 августа 2018, 21:39
2
+1
Код плагина который отменяет у товара публикацию если он не попал в файл импорта

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'msieOnCompleteImportProduct':
        // Массив ID   настроек полей для которых нужно использовать данный плагин http://prntscr.com/kkwx4r
        $presets = array();

        if (!in_array($preset, $presets)) return;

        // Получаем id всех товаров которые были импортированы
        if (!$ids = $modx->event->params['data']) return;

        // Снимаем с публикации товары которые не попали в файл импорта
        $sql = "UPDATE {$modx->getTableName('msProduct')} SET published = 0 WHERE context_key = 'msProduct'  AND  id NOT IN ({$ids});";

        // $sql = "UPDATE {$modx->getTableName('msProductData')} SET my_custom_field = 0 WHERE id  NOT IN ({$ids});";
        $modx->exec($sql);

        break;
}
Василий Наумкин
08 августа 2018, 15:44
3
+2
А рожу вареньем не намазать?

Ладно, держи:
if (!empty($_REQUEST['query'])) {
    $query = htmlspecialchars(strip_tags(trim($_REQUEST['query'])));
    $resource = $modx->getObject('msProduct', [
        'pagetitle' => $query,
        'class_key' => 'msProduct',
        'deleted' => 0,
        'published' => 1,
        'context_key' => $modx->context->key,
    ]);
    if ($resource) {
        $modx->sendRedirect($resource->get('uri'));
    }
}