Очистка кеша при добавлении ресурсов из frontend

Всем доброго дня!
Стояла задача — сделать сайт с функционалом интернет-магазина, с возможностью добавления товаров продавцами (пользователями), а не админом. Реализовал это через formit2resource, с фронтенда. Товары добавляются, все поля заполняются корректно, и в общей ленте товаров в виде превью тоже видны. Но зайти на товар не возможно — по ссылке переводит на главную. То есть у товара отсутствует url. Когда захожу в админку и очищаю кеш сайта — товар становится доступным, url присваивается.
Когда отключил ЧПУ на сайте — этой проблемы нет, и товар доступен сразу, но конечно же, без ЧПУ.
Можно было бы оставить и так, без ЧПУ, но без них не работает TagManager)

В связи с этим, уважаемые форумчане, вопрос: можно ли очищать кеш MODx при сохранении товаров из фронтенда?

P.S. Исследовал вопрос по использованию bezumkin.ru/modx/tickets/, вместо formit2resource. Но нашел только инфу как создавать ресурс с тикетами, не совсем понял как создавать именно товар (обычный документ).

Буду благодарен за любую помощь, или посыл в правильном направлении, который помог бы решить сию задачу)
Вадим
13 марта 2015, 09:42
modx.pro
3
1 732
0

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

Александр
26 июня 2015, 22:04
0
Вадим, как решили проблему? Если да, то как?
Актуальная проблема на данный момент…
    Максим Кузнецов
    26 июня 2015, 22:38
    1
    0
    Создайте плагин на событие OnDocFormSave (+ какой-нибудь доп.фильтр, чтобы чистился только из фронта) или вшейте в сниппет создания ресурса с фронтэнда:
    $modx->cacheManager->refresh(array(настройки_для_детальной_очистки_кэша));
    или
    $modx->cacheManager->clearCache(путь до кэша, доп.опции);
    Подробнее здесь.
      Александр
      26 июня 2015, 23:08
      0
      Пользуюсь компонентом ms2form. Не догоняю, куда прописать нужно

      $modx->cacheManager->refresh();

      Код сниппета:

      <?php
      /* @var array $scriptProperties */
      /* @var ms2form $ms2form */
      
      if (!$modx->user->isAuthenticated()) {
        return $modx->lexicon('ms2form_err_no_auth');
      }
      
      $ms2form = $modx->getService('ms2form', 'ms2form', $modx->getOption('ms2form_core_path', null, $modx->getOption('core_path') . 'components/ms2form/') . 'model/ms2form/', $scriptProperties);
      $config = $ms2form->initialize($modx->context->key);
      
      $data = $config;
      
      if (empty($templates)) {
        $templates = 0;
      }
      if (empty($source)) {
        $source = $modx->getOption('ms2_product_source_default');
      }
      $ms2_product_thumbnail_size = $modx->getOption('ms2_product_thumbnail_size', $scriptProperties, $modx->getOption('ms2_product_thumbnail_size'));
      
      if (empty($parent)) {
        $data['parent'] = '0';
      } else {
        $data['parent'] = $parent;
      }
      $pid = !empty($_REQUEST['pid']) ? (integer)$_REQUEST['pid'] : 0;
      
      // Update of msProduct
      if (!empty($pid)) {
        $tplWrapper = $tplUpdate;
        /* @var msProduct $product */
        if ($product = $modx->getObject('msProduct', array('id' => $pid))) {
          if ($product->get('createdby') != $modx->user->id && !$modx->hasPermission('edit_document')) {
            return $modx->lexicon('ms2form_err_wrong_user');
          }
          $productData = $product->toArray();
          $charset = $modx->getOption('modx_charset');
          $allowedFields = array_map('trim', explode(',', $scriptProperties['allowedFields']));
          $allowedFields = array_unique(array_merge($allowedFields, array('parent', 'pagetitle', 'content')));
      
          $fields = $product->getAllFieldsNames();
          foreach ($allowedFields as $field) {
            if (in_array($field, $fields)) {
              $value = $productData[$field];
            } else {
              $tvId = (int)trim($field, 'tv');
              $value = $product->getTVValue($tvId);
            }
            if (is_string($value)) {
              $value = html_entity_decode($value, ENT_QUOTES, $charset);
              $value = str_replace(array('[^', '^]', '[', ']'), array('[^', '^]', '{{{{{', '}}}}}'), $value);
              $value = htmlentities($value, ENT_QUOTES, $charset);
            }
            $data[$field] = $value;
          }
          $data['id'] = $product->id;
          $data['published'] = $product->published;
          $data['alias'] = $product->alias;
          $data['context_key'] = $product->context_key;
          $data['tags'] = $scriptProperties['tags'];
          $data['template'] = $scriptProperties['template'];
        } else {
          return $modx->lexicon('ms2form_err_id', array('id' => $pid));
        }
      } else {
        $tplWrapper = $tplCreate;
      }
      // todo-me Get available sections for msProduct create
      
      
      // Get templates list
      if(!$data['template']){
        $templates = explode(',', $data['templates']);
        if (count($templates) > 1) {
          foreach ($templates as $template) {
            $selected = '';
            if ($template = explode('==', $template)) {
              if (!empty($pid)) {
                if ($product->template == $template[0]) {
                  $selected = 'selected';
                }
              }
              $data['templates'] .= "<option $selected value=\"$template[0]\">$template[1]</option>";
            } else {
              if (!empty($pid)) {
                if ($product->template == $template) {
                  $selected = 'selected';
                }
              }
              $data['templates'] .= "<option $selected value=\"$template\">$template</option>";
            }
          }
        } else {
          if (!empty($pid)) {
            $data['template'] = $product->template;
          } else {
            $data['template'] = $templates[0];
          }
        }
      }
      
      // Get files list
      if (!empty($allowFiles)) {
        /** @var modMediaSource $source */
        if ($source = $modx->getObject('sources.modMediaSource', $source)) {
          $sourceProperties = $source->getPropertyList();
        }
        $q = $modx->newQuery('msProductFile');
        if (empty($pid)) {
          $q->where(array(
            'product_id' => 0
            ,'parent' => 0
            ,'createdby' => $modx->user->id
          ));
        }else{
          $q->where(array(
            'product_id' => $pid
          , 'parent' => 0
          , 'createdby' => $modx->user->id
          ));
        }
        $q->sortby('createdon', 'ASC');
        $collection = $modx->getIterator('msProductFile', $q);
        $files = '';
        /** @var msProductFile $item */
        foreach ($collection as $item) {
            $item = $item->toArray();
            $item['size'] = round($item['size'] / 1024, 2);
            $item['thumb'] = '/'.$sourceProperties['baseUrl'].$item['path']. $ms2_product_thumbnail_size.'/'. $item['file'];
            $tpl = $item['type'] == 'image'
              ? $tplImage
              : $tplFile;
            $files .= $ms2form->getChunk($tpl, $item);
        }
        $data['files'] = $ms2form->getChunk($tplFiles, array(
          'files' => $files,
        ));
      }
      
      //output
      $output = $ms2form->getChunk($tplWrapper, $data);
      
      return $output;

      Пробовал воткнуть перед return $output; — ничего не изменилось, но в логи записал ошибку "(ERROR @ /connectors/modx.config.js.php) Error caching action map mgr/actions"
        Максим Кузнецов
        26 июня 2015, 23:28
        0
        Скорее всего, вообще никуда в рамках этого сегмента кода.

        Или внутрь контроллера данного модуля по созданию ресурса (в ту часть кода, которая обрабатывает данные формы при отправке) или, если данный модуль создает свои события для плагинов — вешать на них.
          Александр
          27 июня 2015, 15:16
          0
          теперь совсем ничего не понял :)

          Где этот контроллер найти можно?
    Sergey Pozhidaev
    16 октября 2015, 10:57
    1
    0
    Для кого еще актуально, решается прописыванием ссылки на товар
    <a href="[[+uri]]">Смотреть подробнее</a>

    а не [[~[[+id]]]] как делается обычно.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6