Евгений
С нами с 18 марта 2015; Место в рейтинге пользователей: #420Нужно переименовать шаблон через API
Приветствую.
Существует необходимость переименовать начальный шаблон посредством API. Переименование происходит, но в логах трэш получается (xPDOObject — Called set() with an invalid field name: modTemplate_mysql Object). Поскольку сам несколько далек от этого, прошу знатоков подсказать, где в коде ошибки и как он должен выглядеть в результате:
Существует необходимость переименовать начальный шаблон посредством 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();
}
Спасибо. phpStorm. Пути на локальном и удаленном сервере, возможно ли менять при синхронизации?
Всем доброго времени суток! Прошу помощи у знатоков phpStorm.
Есть развернутый проект на локальном сервере. Необходимо его синхронизировать или просто выгрузить на удаленный сервер. Deployment настроил — все коннектится и работает. Вопрос вот в чем: возможно ли при синхронизации заставить phpStorm менять пути в файлах и как это сделать?
Т.е. к примеру в ModX есть файлы-конфиги с путями:
Кто как синхронизирует локальный и удаленный сервер при условии, что базовые пути у них разные?
Спасибо.
Есть развернутый проект на локальном сервере. Необходимо его синхронизировать или просто выгрузить на удаленный сервер. Deployment настроил — все коннектится и работает. Вопрос вот в чем: возможно ли при синхронизации заставить phpStorm менять пути в файлах и как это сделать?
Т.е. к примеру в ModX есть файлы-конфиги с путями:
define('MODX_CORE_PATH', '/Volumes/Server/htdocs/site/public_html/core/');
нужно, чтобы при выгрузке на сервер путь менялся на:define('MODX_CORE_PATH', '/home/site/public_html/core/');
И в обратном направлении тоже.Кто как синхронизирует локальный и удаленный сервер при условии, что базовые пути у них разные?
Спасибо.
Получить и посчитать все заполненные поля из 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
]);
Спасибо. CatalogFill + MIGX
Доброго времени суток!
Прошу помощи в настройке catalogFill. Разбираюсь с конфигурацией. Что качается обычных полей — тут все просто и ясно. Возникла проблема с экспортом/импортом поля MIGX.
Задача и суть проблемы: у меня есть сайт со списком ресурсов (не shopkeeper), у каждого ресурса есть множество полей. Раньше это были простые TV, но скорость загрузки сайта оставляла желать лучшего (особенно страницы каталога с pdoResources). Сейчас все перевел в MIGX — создал новое поле «object_profile» с типом «migx» и в него, соответственно, добавил все остальные поля.
Подскажите, как должен выглядеть файл конфигурации, чтобы был импорт/экспорт полей из MIGX-поля (не MIGXDB) и при этом файл на выходе разбивался на столбцы? Тут у меня 2 догадки: 1) собирать конфиг на базе «migx_catalog», 2) на базе default, но тогда по-идее нужны фильтры для импорта и экспорта.
Буду признателен за ответы. Спасибо.
Прошу помощи в настройке catalogFill. Разбираюсь с конфигурацией. Что качается обычных полей — тут все просто и ясно. Возникла проблема с экспортом/импортом поля MIGX.
Задача и суть проблемы: у меня есть сайт со списком ресурсов (не shopkeeper), у каждого ресурса есть множество полей. Раньше это были простые TV, но скорость загрузки сайта оставляла желать лучшего (особенно страницы каталога с pdoResources). Сейчас все перевел в MIGX — создал новое поле «object_profile» с типом «migx» и в него, соответственно, добавил все остальные поля.
Подскажите, как должен выглядеть файл конфигурации, чтобы был импорт/экспорт полей из MIGX-поля (не MIGXDB) и при этом файл на выходе разбивался на столбцы? Тут у меня 2 догадки: 1) собирать конфиг на базе «migx_catalog», 2) на базе default, но тогда по-идее нужны фильтры для импорта и экспорта.
Буду признателен за ответы. Спасибо.
Помогите допилить фильтр 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;
}
Вывод всех используемых значений TV-поля
Всем доброго времени суток! Подскажите, пожалуйста, каким образом можно вывести список всех используемых значений TV-поля?
Создаю выпадающий список. Нужно, чтобы в значениях option выводились значения определенного TV-поля (тип — одиночный выбор), которые используются в ресурсах с определенным родителем. Буду очень признателен за ответ.
Создаю выпадающий список. Нужно, чтобы в значениях option выводились значения определенного TV-поля (тип — одиночный выбор), которые используются в ресурсах с определенным родителем. Буду очень признателен за ответ.
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
В чем может быть проблема и как ее лечить? Спасибо.
mFilter2 не выводит полный путь к фото
Приветствую!
Друзья, подскажите, пожалуйста, как решить проблему.
Есть собственный источник файлов в котором указан путь media/blog/
Создано TV-поле для изображения, которое использует данный источник с типом ввода «изображение».
Проблема в том, что когда вывожу этот TV через mFilter2, он не подхватывает полный путь. Через pdoResources все работает как надо.
В чем мб проблема и как ее решить?
Друзья, подскажите, пожалуйста, как решить проблему.
Есть собственный источник файлов в котором указан путь media/blog/
Создано TV-поле для изображения, которое использует данный источник с типом ввода «изображение».
Проблема в том, что когда вывожу этот TV через mFilter2, он не подхватывает полный путь. Через pdoResources все работает как надо.
В чем мб проблема и как ее решить?
Нужно подкорректировать/написать пару фильтров для mFilter2
1 1
Приветствую!
Необходимо написать несколько простых фильтров для mFilter2:
1) Фильтр для выбора дорогой и дешевой недвижимости по TV-полю «цена» (по-сути аналог boolean). При этом объекты, у которых цена не указана должны отображаться и там и там.
2) Фильтр кол-ва комнат. Задача, чтобы отображались значения «1», «2», «3», «4+». Т.е. все объекты со значением 4 и больше должны группироваться в один параметр «4+».
Цена договорная. При знании темы работы на час максимум.
Вот что имеется:
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));
}
mFilter2: как вывести фильтр с пустым значением TV?
Всем привет!
Друзья, подскажите, пожалуйста решение задачи: создал свой фильтр для вывода товаров (обычные страницы с TV), который переключает дорогие либо дешевые товары (дороже 340000 или дешевле). За основу брал метод boolean. Как сделать, чтобы и в случае дешевых и в случае дорогих товаров выводились так же товары без цены?
Друзья, подскажите, пожалуйста решение задачи: создал свой фильтр для вывода товаров (обычные страницы с 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;
}
}
Заранее благодарен за ваши ответы.