TITAN-UZ

TITAN-UZ

С нами с 27 февраля 2014; Место в рейтинге пользователей: #56
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Павел Романов
01 июля 2016, 11:39
1
+1
У Вас дата в базе хранится в виде 2016-07-01 03:00:00, а Вы пытаетесь фильтровать по дате в Unix-формате.
Если в лоб, то решение следующее:
1. Сделать еще одно поле timeUnix типа текст.

2. Сделать плагин на событие OnDocFormSave, который будет брать дату из поля timeEvent, переводить ее в нужный формат и записывать в поле TV timeUnix:
<?php
$res = $modx->getObject('modResource', $id);
$date = $res->getTVValue('timeEvent');
if(empty($date)) return '';
$time = strtotime($date);
$res->setTVValue('timeUnix', $time);

3. Выборку в pdoResources cделать уже через этот новый TV:
&where=`{"timeUnix:>=,<=:AND":[1467331200,1498867200]}`
Николай Загумённов
28 мая 2016, 22:56
7
+2
Я использовал компонент tvSuperSelect.
Чтобы с фронта добавлять тэги добавил плагин, который заполняет ТВ поле и таблицу компонента значениями:
<?php
// tvssTagsSave
$tvss = $modx->getService('tvsuperselect', 'tvsuperselect', $modx->getOption('core_path').'components/tvsuperselect/model/tvsuperselect/');
if (!($tvss instanceof tvSuperSelect)) {
    return '';
}

switch ($modx->event->name) {

    case 'OnDocFormSave':
        if (is_object($resource) && is_array($resource->_fields)) {
            $data = $resource->_fields;
            $resource_id = $data['id'];
            // $modx->log(1, print_r($data, 1));

            $flds = $tv_values = array();
            foreach ($data as $key => $value) {
                if ($key == 'tags')  {
                    $tv_id = 1;

                    $array = array_diff($value, array(''));
                    if (!empty($array)) {
                        $flds[] = array(
                            'resource_id' => $resource_id,
                            'tv_id' => $tv_id,
                            'data' => $array,
                        );

                        $tv_values[$tv_id] = $modx->toJSON($array);
                    }
                }
            }
             // пишем в таблицу пакета
            if (!empty($flds)) {
                // $modx->log(1, print_r($flds, 1));

                $table = $modx->getTableName('tvssOption');

                foreach ($flds as $fld) {
                    $sql = 'DELETE FROM '.$table.' WHERE `resource_id` = '.$fld['resource_id'].' AND `tv_id` = '.$fld['tv_id'];
                    $stmt = $modx->prepare($sql);
                    $stmt->execute();
                    $stmt->closeCursor();

                    $values = array();
                    foreach ($fld['data'] as $value) {
                        if (!empty($value)) {
                            $values[] = '('.$fld['resource_id'].',"'.$fld['tv_id'].'","'.addslashes($value).'")';
                        }
                    }

                    if (!empty($values)) {
                        $sql = 'INSERT INTO '.$table.' (`resource_id`,`tv_id`,`value`) VALUES '.implode(',', $values);
                        $stmt = $modx->prepare($sql);
                        $stmt->execute();
                        $stmt->closeCursor();
                    }
                }
            }

            // пишем в таблицу modTemplateVarResource
            if (!empty($tv_values)) {
                //$modx->log(1, print_r($tv_values, 1));

                foreach ($tv_values as $tv_id => $values) {
                    if (!$tv_obj = $modx->getObject('modTemplateVarResource', array(
                        'tmplvarid' => $tv_id,
                        'contentid' => $resource_id,
                    ))) {
                        $tv_obj = $modx->newObject('modTemplateVarResource');
                    }

                    $tv_obj->fromArray(array(
                        'tmplvarid' => $tv_id,
                        'contentid' => $resource_id,
                        'value' => $values,
                    ));
                    $tv_obj->save();
                    // $modx->log(1, print_r($tv_obj->toArray(), 1));

                    unset($tv_obj);
                }
            }
        }
    break;
}
Чтобы выводить во фронте поле добавил сниппет:
<?php
// tvssTagsOptions
/* @var pdoFetch $pdoFetch */
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
$path = $modx->getOption('pdotools_class_path', null, MODX_CORE_PATH.'components/pdotools/model/', true);
if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
    $pdoFetch = new $pdoClass($modx, $scriptProperties);
} else {
    return false;
}
$pdoFetch->addTime('pdoTools loaded');

if (!$modx->addPackage('tvsuperselect', MODX_CORE_PATH.'components/tvsuperselect/model/')) {
    return false;
}

$tv			= $modx->getOption('tv', $scriptProperties, ''); // TV name or...
$tvid		= $modx->getOption('tvId', $scriptProperties, ''); // ... TV id
$tvInput	= $modx->getOption('tvInput', $scriptProperties, ''); // TV input name
$res		= $modx->getOption('res', $scriptProperties, 0); // Resource id
$tpl		= $modx->getOption('tpl', $scriptProperties, 'tpl.tvssTagsOptions');

$tv_where = $tv ? array( 'name' => $tv ) : '';
$tv_where = $tv_where ?: ( $tvid? array( 'id' => $tvid ) : '' );
// print_r($tv_where);

if( empty($tv_where) ) { return; }


if( $tv_obj = $modx->getObject('modTemplateVar', $tv_where) )
{
	$value = '';
	if( $res != 0 && $tv_val_obj = $modx->getObject('modTemplateVarResource', array(
			'tmplvarid'	=> $tv_obj->id,
			'contentid'	=> $res,
	))) {
		$value = $tv_val_obj->value;
	}
	$value_arr = $modx->fromJSON($value); // Массив со значениями тэгов конкретного ресурса

	// Массив, который мы передадим в процессор, там его ловить в $scriptProperties
	$processorProps = array(
	    'tv_id' => $tv_obj->id,
	);
	// Массив опций для метода runProcessor
	$otherProps = array(
	    // Здесь указываем где лежат наши процессоры
	    'processors_path' => $modx->getOption('core_path') . 'components/tvsuperselect/processors/'
	);
	// Запускаем
	$response = $modx->runProcessor('mgr/option/getoptions', $processorProps, $otherProps);
	// И возвращаем ответ от процессора

	$options_array = $modx->fromJSON($response->response); // Массив со всеми тэгами

	
	
	if (is_array($options_array['results']) || is_object($options_array['results'])) {
		foreach($options_array['results'] as $v) {
			$selected = '';
			if (is_array($value_arr) || is_object($value_arr)) {
				foreach ($value_arr as $key => $val) {
					if ($v['value'] == $val) {
						$selected = "selected=\"selected\"";
					}
				}
			}
			$options .= "<option ". $selected ." value=\"". $v['value'] ."\">";
			$options .= $v['value'];
			$options .= "</option>";
			$selected = "";
		}
	}
	
	$return = $modx->getChunk($tpl, array(
		'tv_id'			=> $tv_obj->id,
		'tv_name'		=> $tv_obj->name,
		'tv_input_name'	=> $tvInput ?: $tv_obj->name,
		'tv_value'		=> $value,
		'res_id'		=> $res,
		'options'		=> $options
	));
	
	return $return;
}
else {
	return;
}
Чанк tpl.tvssTagsOptions:
<select name="tags[]" multiple="multiple" class="js-tvSuperSelect-tags form-control" id="ticket-tags">
	[[+options]]
</select>
В чанке с формой добавления/редактирования тикетов добавил:
<link href="/js/select2-4.0.2/dist/css/select2.min.css" rel="stylesheet" />
	<script src="/js/select2-4.0.2/dist/js/select2.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function(){
			$(".js-tvSuperSelect-tags").select2({
				tags: true
			});
		});
	</script>
	<div class="form-group">
		<label for="ticket-sections">Тэги</label>
		[[!tvssTagsOptions? &tv=`tags` &res=`0`]]
		// В чанке редактирования [[!tvssTagsOptions? &tv=`tags` &res=`[[+id]]`]]
		<span class="error"></span>
	</div>
Прикрутил к полю тэгов Select2, чтобы тэги было удобно заполнять и все.
Может кому пригодится =)
Алексей Кудров
02 мая 2016, 13:56
2
0
В меню «Настройка форм» создать новый профиль с именем, например, «Блог».

В профиле создать новый набор правил:

Действие: Создать ресурс
Ограничивающее поле: parent
Ограничивающее значение: id родителя

Правой кнопкой по созданному набору — редактировать.

Указать id шаблона для дочерних элементов.

Володя
14 апреля 2016, 11:27
2
+1
Отправил Василию PR — github.com/bezumkin/pdoTools/pull/203
добавляет PCRE модификаторы, можно будет делать следующее
{'$40 за g3/400' | preg_quote}

{if 'email@mail.ru'|preg_match : '/^.+@.+\.\w+$/' }
    email
{/if}

{$_modx->resource.content|preg_get : '!http://.+\.(?:jpe?g|png|gif)!Ui'}

{["26-04-1974", "Сергей", "27-11-1977", "Юля"] | preg_grep : "/(\d{2})-(\d{2})-(\d{4})/" | print_r : true}

Website: {'http://site.name'|preg_replace : '~^https?://~'}

{'I love MODX' | preg_split : '/ /' | print_r : true}
ваша задача тогда может быть решена просто как
выбираем первое изображение из поля <b>content</b>
{set $image = $_modx->resource.content|preg_get : '!http://.+\.(?:jpe?g|png|gif)!Ui}
Дмитрий Танцирев
08 апреля 2016, 21:56
10
0
Может кому пригодится:

{"field":"published", "caption":"Чекбокс", "inputTVtype":"checkbox", "inputOptionValues":"Да==1"}

{"header": "Чекбокс", "dataIndex":"published", "show_in_grid":1, "renderer":"this.renderCrossTick"}
Павел
23 марта 2016, 11:48
1
+1
Вообщем по разбивка ресурсов по месяцам:
[[!pdoResources?
  &parents=`26`
  &sortby=`publishedon`
  &sortdir=`ASC`
  &limit=`0`
  &select=`publishedon as period`
  &groupby=`DAYOFMONTH(FROM_UNIXTIME(publishedon))`
  &tpl=`test_pavel2`
]]
tpl.NewsFeed:
<h2>[[+period:date=`%B-%Y`]]</h2>
[[!timePeriod? &period=`[[+period]]`]]
[[pdoResources?
  &parents=`26`
  &sortby=`publishedon`
  &sortdir=`ASC`
  &limit=`0`
  &where=`["publishedon BETWEEN [[+tp.start]] AND [[+tp.end]]"]`
  &tpl=`@INLINE <h3>{{+pagetitle}}</h3><p>{{+introtext}}</p>`
]]
и сам сниппет timePeriod:
<?php
$start = strftime("1.%m.%Y",$period) . " 00:00:00";
$end = strftime(date('t', $period).".%m.%Y",$period) . " 23:59:59";

$modx->toPlaceholders(array(
  'start' => strtotime($start),
  'end' => strtotime($end),
),'tp');

return $start." - ".$end ;
Сергей Сергеевич
07 марта 2016, 15:02
1
+1
Спасибо вам! Соорудил свой велосипед, все работает! Но чует сердце, это плохой путь =)

<nav class="nav">
  [[pdoMenu? 
    &parents=`0` 
    &resources=`1,3,4,5`
    &level=`2`
    &outerClass=`nav__list`
    &rowClass=`nav__item`
    &firstClass=`0`
    &lastClass=`0`
    &hereClass=``
    &parentClass=``
    &tpl=`@INLINE <li[[+classes]]><a href="[[+link]]" class="nav__link">[[+menutitle]]</a></li>[[+wrapper]]`
    &tplHere=`@INLINE <li class="nav__item current"><a href="[[+link]]" class="nav__link">[[+menutitle]]</a></li>[[+wrapper]]`
    &tplInner=`@INLINE [[+wrapper]]`
    ]]
</nav>
Сергей Фещуков
04 марта 2016, 06:02
3
0
Для товаров miniShop2 упрощённый вариант плагина:
<?php
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;
$resource->set('article', substr($resource->get('alias'),0,2).'-'.$resource->get('parent').$resource->get('id'));
$resource->save();
$resource->clearCache();
Максим Кузнецов
29 февраля 2016, 13:46
4
+2
Для fenom:
{set $canonical_url = $_modx->makeUrl($_modx->resource.id, '', '', 'full')}

<link rel="canonical" href="{$canonical_url}" />
<meta property="og:url" content="{$canonical_url}" />


Тегами modx:
<link rel="canonical" href="[[~[[*id]]? &scheme=`full`]]" />
<meta property="og:url" content="[[~[[*id]]? &scheme=`full`]]" />

Или, например, вот так (не помню для чего, но как-то возникла проблема с предыдущим вариантом, которая решилась нижеописанным примером):
[[++site_url]][[*id:isnot=`[[++site_start]]`:then=`[[~[[*id]]]]`]]