• avatar paic
  • 0
Спасибо
  • avatar paic
  • 0
Это все потому, что у меня подход, до того как прочитал Ваш пример, был другой:
1. Вытащить (получить), проверить — что все вытащилось правильно.
2. Совершить какое-то действие с тем что вытащил п.1.

А Ваш пример заставил посмотреть на жизнь по-новому — все можно сделать не выходя из (т.е. внутри) sql. Я раньше никогда так не делал, обязательно возьму на вооружение))

По modResource — это скорее всего от недопонимания — я считал, что если в селекте я уже вытащил что-то и в result получилось, к примеру, 3 ресурса, то дальше они эти 3 и будут обрабатываться, а не все как Вы указали.

Спасибо.
  • avatar Dreamer
  • 1
Вы все в кучу смешали.

Во-первых, вы переопределяете $data. А это как раз-таки массив параметров, которыей передается в функцию prepare, оно содержит как раз переданные в чанк поля. И возвращать нужно как раз-таки $data.

То есть вам нужно сделать
$pagetitle=$data['pagetitle'];


А чтобы в вашем чанке появилось требуемое значение в [+previewimage+], вам нужно сделать так:

$data['previewimage'] = //ваше вычисленное значение;
// .......
return $data;//обязательно должно быть в конце сниппета

  • avatar webber
  • 1
В приведенном примере вынести за пределы foreach инициализацию класса
$doc = new modResource($modx);

и очистку кэша (зачем его чистить после каждого обновления — достаточно одного раза в конце:)
т.е. внутри цикла
$doc->save(false,false);

а уже после цикла
$modx->clearCache("full");
  • avatar webber
  • 1
Может все-таки через update попробовать без привлечения modResource($modx) и foreach. Ведь таким образом мы получаем все данные по всем ресурсам, которые хотим отредактировать — которые нам совершенно не нужны. Типа такого
$modx->db->query("UPDATE $t2 LEFT JOIN $t1 ON $t1.contentid = $t2.id SET $t2.createdon=($t2.createdon+$t1.value) WHERE $t1.tmplvarid='19' AND $t2.createdon<($tek-$t1.value)");

синтаксис, в случае чего, скорректировать только :)
  • avatar paic
  • 0
Добрый день.
Такой вопрос и суть проблемы.
На сайте есть небольшой фильтр в боковой колонке. И есть пожелание, чтобы этот фильтр в мобильной версии открывался в панели (сделал на off-canvas).
И получается на странице 2 одинаковые формы.
Даже если одна форма с плейсхолдером
[+eFilter_form+]

при адаптации скрывается стилями — все-равно нормально работает только первая форма.
Я понимаю, что там все на id, но может есть какие варианты этот вопрос разрешить?
Может я чего-то просто не знаю, например, у DL (Ditto тоже) есть параметр id и тогда все плейсхолдеры вида
[+id.eFilter_form+]

Может еще какие решения есть?
  • avatar paic
  • 0
На самом деле, если на странице есть ТВ с предустановленными периодами (админ выбирает сам через сколько суток какую страницу обновлять), делается аналогично, как и подсказал webber , через JOIN. Получилось так
$e = &$modx->Event;
if ($e->name == "OnWebPageInit") {
	
$t1 = $modx->getFullTableName('site_tmplvar_contentvalues');
$t2 = $modx->getFullTableName('site_content');

$tek = time();
	
$result = $modx->db->query("SELECT $t1.*, $t2.* FROM $t1 LEFT JOIN $t2 ON $t1.contentid = $t2.id WHERE $t1.tmplvarid='19' AND createdon<($tek-value)");
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");
$data = $modx->db->makeArray($result);
foreach ($data as $el) {
    $doc = new modResource($modx);
    $doc->edit($el['id']);
	$period =($el['value']);
	$news = ($el['createdon'])+$period;
    $doc->set('createdon',$news);
    $doc->save(false,true);
}
	
}


Здесь ТВ c id=19 есть этот параметр для установки периода обновления даты создания страницы.

Всем спасибо за помощь.
  • avatar gregst
  • 0
согласен, налажал

а как в doclister так сделать? что-то не пойму где в документации найти просто замена formlister на DocLister ничего не дала

так тоже неправильно
<?php
$add = parse_url($pagetitle);
$http = $add[scheme];
$host = $add[host];

$data = file_get_contents($pagetitle);
$images = array();
preg_match_all('/(img|src)=("|\')[^"\'>]+/i', $data, $media);
unset($data);
$data = preg_replace('/(img|src)("|\'|="|=\')(.*)/i', "$3", $media[0]);
 
foreach ($data as $url) {
    $info = pathinfo($url);
    if (isset($info['extension'])) {
        if (($info['extension'] == 'jpg') ||
                ($info['extension'] == 'jpeg') ||
                ($info['extension'] == 'gif') ||
                ($info['extension'] == 'png'))
            array_push($images, $url);
    }
}

$foto = $images[1];
$previewimage = $http.$host.$foto
$modx->setPlaceholder('previewimage', $previewimage);

  • avatar saniock
  • 0
нуу както не понятно, вызывете DocLister а в снипете $FormLister->getField
  • avatar gregst
  • 0
подскажите, что я делаю неверно?

вызов doclister:
[!DocLister?
&prepare=`parseimage`
&parents=`[*id*]` 
&tpl=`@CODE
<div class="item">
	<a href="[+pagetitle+]"><img src="[+tv.price+]" class="img_preview"/></a>
	<div class="name">Фотограф: <b>[+longtitle+]</b></div>
	<div class="link"><a href="[+pagetitle+]">[+pagetitle+]</a></div>
	[+previewimage+]
</div>`
&tvList=`price,author`
&userFields=`tv.author`
&extender=`user`
!]


parseimage
<?php
$pagetitle = (int)$FormLister->getField('pagetitle');
$add = parse_url($pagetitle);
$http = $add[scheme];
$host = $add[host];

$data = file_get_contents($pagetitle);
$images = array();
preg_match_all('/(img|src)=("|\')[^"\'>]+/i', $data, $media);
unset($data);
$data = preg_replace('/(img|src)("|\'|="|=\')(.*)/i', "$3", $media[0]);
 
foreach ($data as $url) {
    $info = pathinfo($url);
    if (isset($info['extension'])) {
        if (($info['extension'] == 'jpg') ||
                ($info['extension'] == 'jpeg') ||
                ($info['extension'] == 'gif') ||
                ($info['extension'] == 'png'))
            array_push($images, $url);
    }
}

$foto = $images[1];
$previewimage = $http.$host.$foto
$FormLister->setPlaceholder('previewimage', $previewimage);


суть — в pagetitle вложенного документа указана ссылка на страницу, нужно с этой страницы взять вторую картинку и вывести на нее ссылку

Спасибо заранее
  • avatar paic
  • 0
Спасибо, так и буду делать, я как малознакомый с моделями думал может там есть какие инструменты.
  • avatar webber
  • 1
мне кажется, все это можно сделать один запросом на update с джойном двух таблиц (контент и значения тв) где разница между текущей датой и createdon будет больше значения тв period и соответственно простановкой новой createdon в time() (текущее время) ну или в сумму createdon+period :)
  • avatar Dmi3yy
  • 0
Вот так работать не может в принципе ибо сначала парситься [++]

[[DocLister? &tpl=`@CODE: [[snip? ¶ms=`[+pagetitle+]`]]`


используйте или чанк как шаблон или свой снипет перенесите в prepare
И еще момент. Если вы вызываете сниппет с функцией через чанк доклистер, то у вас должно все сломаться нафиг) функцию надо объявлять один раз на странице. А у вас если доклистер выдает 10 чанков то и 10 раз будет объявляться функция. лучше это все сделать в доклистере через prepare. Почитайте про этот параметр и не мучайтесь.
Если вызываете сниппет в чанке доклистера, попробуйте кэшированный вызов сниппета [[parseimg? &pageurl=`[+pagetitle+]`]]
  • avatar gregst
  • 0
да, вызов в doclister
там именно ++, в сниппет параметр передается, но в функцию не передается
так вызов где делаете внутри сниппета, типа Доклистера или где?
[!parseimg?&pageurl=`[+pagetitle+]`!]
Может надо [+pagetitle+] заменить на [*pagetitle*]?
  • avatar kymage
  • 0
хм… показывает 1 2 3 4 5… 8 9
страниц всего 9 пока но нужно чтоб было не более 5 на экран.
  • avatar paic
  • 0
Я обычно так делаю, в вызове:
&pageLimit=`1` &pageAdjacents=`1`

В шаблонах добавить (только применительно к вашей верстке):
&TplDotsPage=`@CODE:<li><a href="[+link+]" class="page"> ... </a></li>`

ну и если с вашим id
[+listintrotext.pages+]
  • avatar paic
  • 0
Дык, в том то и дело, что елки — с моделями у меня пока совсем туго, хотя замечаю что все чаще в постах мелькают именно они, так что предстоит еще засаживаться за уроки.

Пользуясь случаем, а как сделать, если $period на разных страницах разный?

Т.е. на странице есть параметр TV c названием period типа radio вида
10 суток==4320000||20 суток==8640000||30 суток==3592000 и админ каждой странице назначает свой период обновления