TITAN-UZ

TITAN-UZ

С нами с 27 февраля 2014; Место в рейтинге пользователей: #56
Дмитрий Меркурьев
12 октября 2016, 17:14
1
+1
Так как у тв текстовый тип данных и дата там храниться в виде 2016-10-13 01:00:00
и where date > '2016-10-13 01:00:00' не сработает.

Недавно в одном из проектов пришлось делать тоже самое что и в задаче, правда с pdoTools но подход одинаков.
Решалось это следующим образом.
Устанавливался плагин DateToTimestamp, который при сохранении tv с типом дата конвертирует дату в метку времени. Код плагина:
<?php
/*
 * DateToTimestamp Plugin for MODX Revolution
 * @code @theboxer
 * @comments @sepiariver
 *
 * DateToTimestamp is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * DateToTimestamp is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * DateToTimestamp; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA 
 *
 */
 
// Only for use in the MODX mgr
if ($modx->context->get('key') != 'mgr') {
        return;
}

// Enable events 'OnResourceTVFormRender' and 'OnDocFormSave'
$eventName = $modx->event->name;
switch($eventName) {
    
    // When rendering, convert timestamps back to dates so standard TV Date Inputs can read it
    case 'OnResourceTVFormRender':
        // Must set IDs of TVs on which to operate in the Plugin's Properties
        $tvs = $modx->getOption('tvs', $scriptProperties, '');
        $tvs = explode(',', $tvs);
        $tvs = array_map('trim', $tvs);
        $tvs = array_keys(array_flip($tvs));
        $tvs = array_filter($tvs);
        $tvs = array_flip($tvs);
        
        // John is awesome
        foreach ($categories as $idc => $category) {
            foreach ($category['tvs'] as $idt => $tv) {
                if ($tv->type != 'date' || !isset($tvs[$tv->id])) {
                    continue;
                }

                $timestamp = $categories[$idc]['tvs'][$idt]->processedValue;
                $badValue = $categories[$idc]['tvs'][$idt]->value;

                $categories[$idc]['tvs'][$idt]->set('value', strftime('%Y-%m-%d %H:%M:%S', $timestamp));
                $categories[$idc]['tvs'][$idt]->set('formElement', str_replace($badValue, $categories[$idc]['tvs'][$idt]->value, $categories[$idc]['tvs'][$idt]->formElement));
            }
        }

        break;
    // When saving, convert values to timestamp for sorting and comparing
    case 'OnDocFormSave':
        if (intval($resource->tvs) != 1) {
            break;
        }
        // Must set IDs of TVs on which to operate in the Plugin's Properties
        $tvs = $modx->getOption('tvs', $scriptProperties, '');
        $tvs = explode(',', $tvs);
        $tvs = array_map('trim', $tvs);
        $tvs = array_keys(array_flip($tvs));
        $tvs = array_filter($tvs);

        foreach ($tvs as $tv) {
            if ($resource->get('tv' . $tv) == '') {
                continue;
            }

            $tvObject = $modx->getObject('modTemplateVar', $tv);
            if (!$tvObject || $tvObject->type != 'date' ){
                continue;
            }

            $value = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tv, 'contentid' => $resource->id));
            if (!$value) {
                continue;
            }

            $value->set('value', strtotime($value->value));
            $value->save();

        }

        break;
}
Он подключается на события OnResourceTVFormRender' и 'OnDocFormSave'
Так же в параметры необходимо добавить параметр tvs со значением ид вашей tv с датой.
Далее уже можно составлять условие date >= текущее время.

Но, скорее всего где то сломается вывод даты и его нужно будет чинить, т.к. значения будут сохраняться теперь в другом формате.

Скорее всего без навыков в программировании здесь не справиться, и нужно привлекать кого то со стороны.
Илья Уткин
11 октября 2016, 15:08
2
+3
У меня есть вот такой файлик, который позволяет большие числа переводить в 60-ричную систему для сокращения количества символов:

<?php
class SixtyCoder {
    public $table = '0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
    
    public function to60($number = 0) {
        $number = (int) $number;
        $output = '';
        return $this->divide($number);
    }
    
    public function from60($letters = '0') {
        $length = strlen($letters);
        $number = 0;
        for ($i = 0; $i < $length; $i++) {
            $pos = strpos($this->table, $letters[$i]);
            if ($pos === false) {
                return 0;
            }
            $pow = $length - ($i+1);
            $number = $number + $pos * pow (60, $pow);
        }
        return $number;
    }
    
    public function divide($number = 0, $letters = '') {
        if ($number < 60) {
            $letters = $this->getLetter($number) . $letters;
        } else {
            $rest = $number % 60;
            $letters = $this->getLetter($rest) . $letters;
            $number = ($number - $rest) / 60;
            $letters = $this->divide($number, $letters);
        }
        return $letters;
    }
    
    public function getLetter($number) {
        return substr($this->table, $number, 1);
    }
}

$coder = new SixtyCoder();
$time = time();
echo 'Long: ' . $time;
$short = $coder->to60($time);
echo '
Short: ' . $short;
echo '
Long from short: ' . $coder->from60($short);
Николай Загумённов
07 октября 2016, 14:56
3
0
Решение для редактора TinyMCE Rich Text Editor

1. Создать файлик config.json в папке /assets/components/tinymcerte/js/mgr/extras/ с вот таким содержимым:
{
    "relative_urls":false,
    "document_base_url":"/",
    "remove_script_host":true
}
2. Прописать путь до этого файла в настройке tinymcerte.external_config
{assets_path}components/tinymcerte/js/mgr/extras/config.json
Павел Романов
27 сентября 2016, 16:41
2
+1
Поправочка (всё-таки ошибся))):

{var $av = $_pls['tv.aviable']}
{if $av == 0}
	Нет в наличии
{else}
	{if $av > 1 && $av < 10}
		<i class="fa fa-circle"></i>
	{else}
		{if $av >= 10 && $av < 30}
			<i class="fa fa-circle"></i> <i class="fa fa-circle"></i>
		{else}
			{if $av >= 30}
				<i class="fa fa-circle"></i> <i class="fa fa-circle"></i> <i class="fa fa-circle"></i>
			{/if}
		{/if}
	{/if}
{/if}
but1head
12 сентября 2016, 18:48
2
+2
https://github.com/fenom-template/fenom/blob/master/docs/ru/tags/foreach.md

{foreach $list as $value}
 <div>{if $value@first} first item {/if} {$value}</div>
{/foreach}

или

{foreach $list as $value first=$first}
 <div>{if $first} first item {/if} {$value}</div>
{/foreach}
Сергей Шлоков
07 сентября 2016, 08:45
1
+1
А так
...
&where=`["TVeventdate.value >= NOW()"]`
или так
...
&where=`["EventDate >= NOW()"]`
Сергей Шлоков
07 сентября 2016, 08:28
1
0
[[!pdoResources?
	&tpl=`ImmediateEvents`
	&includeTVs=`1`
	&includeContent=`1`
	&includeTVs=`EventImage, EventDate`
	&processTVs=`1`
	&limit=`4444`
	&where=`["TVEventDate.value >= NOW()"]`
	&showLog=`1`
]]
Вызывать обязательно некэшированным.
Andrey
01 сентября 2016, 20:39
1
0
Нашел строчку:
$context = array_map('trim', explode(',', $this->getProperty('context', $this->modx->context->key)));
Может надо её как то изменить? Или поковыряться в этом файле:
core/components/tickets/processors/web/section/getlist.class.php

На правильном ли я пути?
Владимир
30 августа 2016, 21:09
1
0
Большое спасибо за помощь.
В итоге у меня получился такой чанк
[[!Snipet? &field1=`[[*link_attributes]]` &field2=`[[*longtitle]]` ]]
И такой снипет
<?php
if(!empty($field1) && !empty($field2)) {
    $res=$modx->getChunk('chunk1');
} else {
    $res=$modx->getChunk('chunk2');
}
return $res;
Работает именно так как и задумано, если указанные поля не пустые отрабатывает первый чанк, если хоть одно из двух полей пустое, отрабатывает второй чанк. Работает не значит правильно. Нет ли здесь косяков?
Илья Уткин
16 августа 2016, 12:37
4
+5
Не надо ничего мудрить. Даже отдельный шаблон не нужен. Я обычно так делаю:
<div>
    [[pdoResources?
      &parents=`0`
      &limit=`0`
      &tpl=`@INLINE <p>{$pagetitle}</p>{if $idx % 5 == 0}</div><div>{/if}`
    ]]
</div>

Но тут человек хотел именно сам разобраться с тем, как писать сниппеты для MODX. Он получил большой опыт за небольшое время. Ну и далеко не все наткнутся где-нибудь на моё решение, а если это будет отдельный сниппет, начинающие будут им пользоваться.