Евгений

Евгений

С нами с 18 марта 2015; Место в рейтинге пользователей: #409

Нужно переименовать шаблон через API

Приветствую.

Существует необходимость переименовать начальный шаблон посредством API. Переименование происходит, но в логах трэш получается (xPDOObject — Called set() with an invalid field name: modTemplate_mysql Object). Поскольку сам несколько далек от этого, прошу знатоков подсказать, где в коде ошибки и как он должен выглядеть в результате:

/** @var modTemplate $base_template */
if ($base_template = $this->modx->getObject('modTemplate', array('templatename' => 'Начальный шаблон'))) {
    $base_template->fromArray([
        'templatename' => 'BaseTemplate',
    ], '', true, true);
    $base_template->set($base_template, $attributes);
    $base_template->save();
}
Спасибо.
Евгений
20 декабря 2019, 14:18
modx.pro
690
0

phpStorm. Пути на локальном и удаленном сервере, возможно ли менять при синхронизации?

Всем доброго времени суток! Прошу помощи у знатоков phpStorm.

Есть развернутый проект на локальном сервере. Необходимо его синхронизировать или просто выгрузить на удаленный сервер. Deployment настроил — все коннектится и работает. Вопрос вот в чем: возможно ли при синхронизации заставить phpStorm менять пути в файлах и как это сделать?

Т.е. к примеру в ModX есть файлы-конфиги с путями:
define('MODX_CORE_PATH', '/Volumes/Server/htdocs/site/public_html/core/');
нужно, чтобы при выгрузке на сервер путь менялся на:
define('MODX_CORE_PATH', '/home/site/public_html/core/');
И в обратном направлении тоже.

Кто как синхронизирует локальный и удаленный сервер при условии, что базовые пути у них разные?

Спасибо.
Евгений
14 мая 2019, 16:41
modx.pro
1 117
0

Получить и посчитать все заполненные поля из MIGX

Прошу помощи в решении задачи: есть готовый сниппет, который считает заполненные TV-поля и затем выводит их в указанное кол-во столбцов. Необходимо переделать его под работу с MIGX.

<?php
//передаваемые в сниппет параметры
//id - id ресурса с которого берем нужные поля
//tvInput - id полей для проверки, через запятую
//cols_count - количество выводимых колонок
//tpl - шаблон вывода
$id = $id;
$tvInput = explode(',',$tvs);
$cols_count = $cols;
$tpl = $tpl;

if (!isset($tvInput)) { return false; } // Если не указаны TV, прекращаем выполнение кода
if (!isset($id)) { $id = $modx->resource->get('id'); } // По-умолчанию текущий ресурс
if (!isset($cols_count)) { $cols_count = 2; } // Количество колонок по-умолчанию
if (!isset($tpl)) { $tpl = 'object_params'; } // Шаблон по-умолчанию

$criteria = $modx->newQuery('modTemplateVarResource', [
              'contentid' => $id,
              'tmplvarid:IN' => $tvInput,
              'value:!=' => ''
            ]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);

//выводим по колонкам
//default_elems_at_col - количество элементов в колонке
$output = '';
$count = count($docs);
$default_elems_at_col = floor($count / $cols_count);
$continue_default = false;

/* 
  как работает:
  например: 52 элемента на 5 колонок
  $default_elems_at_col - количество элементов в колонке по умолчанию floor(52 / 5) = 10
  остается 2 элемента (52 - 50), которые необходимо распределить по колонкам, т.е.
  $real_default_elems_at_col = 11 (для первых двух колонок)
  $continue_default - переменная, чтобы прекратить лишние вычисления на итерациях, когда лишних элементов не осталось
*/
$output .= '<div class="params params_cols-' . $cols_count . '">';
for ($i = 0; $i < $cols_count; $i++) {
  if (!$continue_default) {
    $real_default_elems_at_col = $default_elems_at_col + 1;
    if ( ($real_default_elems_at_col * ($i + 1) + ($cols_count - $i - 1) * $default_elems_at_col) > $count ) {
      $real_default_elems_at_col = $default_elems_at_col;
      $continue_default = true;
    }
  } 

  $output .= '<div class="params__column">';
  for ($j = 0; $j < $real_default_elems_at_col; $j++) {
    $current_doc = current($docs)->toArray();
    $tvId = $current_doc["tmplvarid"];
    $value = $current_doc["value"];
    
    $output .= $modx->getChunk($tpl, [
                'tvId' => $tvId,
                'value' => $value
               ]);

    //если следующего элемента нет - выходим из цикла
    if (!next($docs)) {
      break;
    }
  }
  $output .= '</div>';
}
$output .= '</div>';
return $output;
Т.е. вместо

$criteria = $modx->newQuery('modTemplateVarResource', [
              'contentid' => $id,
              'tmplvarid:IN' => $tvInput,
              'value:!=' => ''
            ]);
$docs = $modx->getCollection('modTemplateVarResource', $criteria);
нужно получить и посчитать непустые поля MIGX, думаю в этом направлении:
$criteria = $modx->runSnippet('getImageList',array(
'tvname'=> $tvInput, 
'tpl'=>'@CODE: [[+name]]==[[+value]]',
'outputSeparator'=>'||',
'docid' => $id
));
а вместо
$tvId = $current_doc["tmplvarid"];
$value = $current_doc["value"];

$output .= $modx->getChunk($tpl, [
            'tvId' => $tvId,
            'value' => $value
           ]);


должно быть что-то вроде
$tvName = $current_doc["name"];
$value = $current_doc["value"];

$output .= $modx->getChunk($tpl, [
            'tvName' => $tvName,
            'value' => $value
           ]);
Спасибо.
Евгений
04 марта 2019, 13:09
modx.pro
1 103
0

CatalogFill + MIGX

Доброго времени суток!

Прошу помощи в настройке catalogFill. Разбираюсь с конфигурацией. Что качается обычных полей — тут все просто и ясно. Возникла проблема с экспортом/импортом поля MIGX.

Задача и суть проблемы: у меня есть сайт со списком ресурсов (не shopkeeper), у каждого ресурса есть множество полей. Раньше это были простые TV, но скорость загрузки сайта оставляла желать лучшего (особенно страницы каталога с pdoResources). Сейчас все перевел в MIGX — создал новое поле «object_profile» с типом «migx» и в него, соответственно, добавил все остальные поля.

Подскажите, как должен выглядеть файл конфигурации, чтобы был импорт/экспорт полей из MIGX-поля (не MIGXDB) и при этом файл на выходе разбивался на столбцы? Тут у меня 2 догадки: 1) собирать конфиг на базе «migx_catalog», 2) на базе default, но тогда по-идее нужны фильтры для импорта и экспорта.

Буду признателен за ответы. Спасибо.
Евгений
05 февраля 2019, 13:25
modx.pro
2 804
0

Помогите допилить фильтр number в mFilter2

Доброго времени суток! Прошу помощи у знатоков: как допилить стандартный фильтр number, чтобы выводились в том числе, страницы с пустым значением TV? Спасибо.

<?php

public function filterNumber(array $requested, array $values, array $ids) {
	$matched = array();

	$min = floor(min($requested));
	$max = ceil(max($requested));

	$tmp = array_flip($ids);
	foreach ($values as $number => $resources) {
		if ($number >= $min && $number <= $max) {
			foreach ($resources as $id) {
				if (isset($tmp[$id])) {
					$matched[] = $id;
				}
			}
		}
	}

	return $matched;
}
Евгений
18 января 2019, 12:04
modx.pro
510
0

Вывод всех используемых значений TV-поля

Всем доброго времени суток! Подскажите, пожалуйста, каким образом можно вывести список всех используемых значений TV-поля?

Создаю выпадающий список. Нужно, чтобы в значениях option выводились значения определенного TV-поля (тип — одиночный выбор), которые используются в ресурсах с определенным родителем. Буду очень признателен за ответ.
Евгений
17 января 2019, 12:57
modx.pro
642
0

mFilter2 и virtualPage - Cannot declare class myCustomFilter, because the name is already in use

Друзья, никто не сталкивался с такой проблемой: пытаюсь вывести на сайте каталог при помощи mFilter2, создал свои фильтры — все работает, но если вывожу его при помощи virtualPage — выдает следующую ошибку:

Fatal error: Cannot declare class myCustomFilter, because the name is already in use in /core/components/msearch2/custom/filters/my.class.php on line 156

В чем может быть проблема и как ее лечить? Спасибо.
Евгений
07 декабря 2018, 18:04
modx.pro
875
0

mFilter2 не выводит полный путь к фото

Приветствую!

Друзья, подскажите, пожалуйста, как решить проблему.

Есть собственный источник файлов в котором указан путь media/blog/



Создано TV-поле для изображения, которое использует данный источник с типом ввода «изображение».

Проблема в том, что когда вывожу этот TV через mFilter2, он не подхватывает полный путь. Через pdoResources все работает как надо.

В чем мб проблема и как ее решить?
Евгений
05 декабря 2018, 12:52
modx.pro
647
0

Нужно подкорректировать/написать пару фильтров для mFilter2

1 1
Приветствую!

Необходимо написать несколько простых фильтров для mFilter2:

1) Фильтр для выбора дорогой и дешевой недвижимости по TV-полю «цена» (по-сути аналог boolean). При этом объекты, у которых цена не указана должны отображаться и там и там.
2) Фильтр кол-ва комнат. Задача, чтобы отображались значения «1», «2», «3», «4+». Т.е. все объекты со значением 4 и больше должны группироваться в один параметр «4+».

Цена договорная. При знании темы работы на час максимум.

Вот что имеется:

1) по дорогой и дешевой недвижимости фильтр есть, но он не отображает товары без цены:

<?php
class myCustomFilter extends mse2FiltersHandler {

  public function buildClassFilter(array $values) {
    if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
      return array();
    }

    $results = array();
    $this->modx->lexicon->load('aveo:default');

    foreach ($values as $value => $ids) {
      $chip = empty($value) || (is_numeric($value) && (int)$value <= 340000);
      $title = $chip
      ? $this->modx->lexicon('affordable')
      : $this->modx->lexicon('elite');

      if (!isset($results[$title])) {
        $results[$title] = array(
          'title' => $title,
          'value' => (int)!$chip,
          'type' => 'class',
          'resources' => $ids
        );
      }
      else {
        $results[$title]['resources'] = array_merge($results[$title]['resources'], $ids);
      }
    }

    return $this->sortFilters($results, 'class', array('name' => $name));
  }

  public function filterClass(array $requested, array $values, array $ids) {
    $matched = array();
    $tmp = array_flip($ids);

    foreach ($requested as $value) {
      foreach ($values as $k => $resources) {
        $chip = empty($k) || (is_numeric($k) && (int)$k <= 340000);

        if ((empty($value) && !$chip) || (!empty($value) && $chip)) {
          continue;
        }

        foreach ($resources as $id) {
          if (isset($tmp[$id])) {
            $matched[] = $id;
          }
        }
      }
    }

    return $matched;
  }
2) По фильтру кол-ва комнат сейчас группируются они так:

public function buildBedroomsFilter(array $values) {
    if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
      return array();
    }

    $results = array();

    foreach ($values as $value => $ids) {
      $many = (is_numeric($value) && (int)$value >= 4);
      $title = !$many ? $value : '4+';
      $value = !$many ? $value : '4';

      if (!isset($results[$title])) {
        $results[$title] = array(
          'title' => $title,
          'value' => $value,
          'type' => 'bedrooms',
          'resources' => $ids
        );
      }
      else {
        $results[$title]['resources'] = array_merge($results[$title]['resources'], $ids);
      }
    }

    return $this->sortFilters($results, 'bedrooms', array('name' => $name));
}
Евгений
30 октября 2018, 17:41
modx.pro
555
0

mFilter2: как вывести фильтр с пустым значением TV?

Всем привет!

Друзья, подскажите, пожалуйста решение задачи: создал свой фильтр для вывода товаров (обычные страницы с TV), который переключает дорогие либо дешевые товары (дороже 340000 или дешевле). За основу брал метод boolean. Как сделать, чтобы и в случае дешевых и в случае дорогих товаров выводились так же товары без цены?
<?php
class myCustomFilter extends mse2FiltersHandler {

  public function buildClassFilter(array $values) {
    if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
      return array();
    }

    $results = array();
    $this->modx->lexicon->load('aveo:default');

    foreach ($values as $value => $ids) {
      $chip = empty($value) || (is_numeric($value) && (int)$value <= 340000);
      $title = $chip
      ? $this->modx->lexicon('affordable')
      : $this->modx->lexicon('elite');

      if (!isset($results[$value])) {
        $results[$value] = array(
          'title' => $title,
          'value' => (int)!$chip,
          'type' => 'class',
          'resources' => array()
        );
      }

      foreach ($ids as $id) {
        $results[$value]['resources'][] = $id;
      }
    }

    ksort($results);

    return $results;
  }

  public function filterClass(array $requested, array $values, array $ids) {
    $matched = array();
    $value = $requested[0];
    $tmp = array_flip($ids);

    foreach ($requested as $value) {
      foreach ($values as $k => $resources) {
        $chip = empty($k) || (is_numeric($k) && (int)$k <= 340000);

        if ((empty($value) && !$chip) || (!empty($value) && $chip)) {
          continue;
        }

        foreach ($resources as $id) {
          if (isset($tmp[$id])) {
            $matched[] = $id;
          }
        }
      }
    }

    return $matched;
  }
}
Заранее благодарен за ваши ответы.
Евгений
30 октября 2018, 12:44
modx.pro
678
0