В конце концов разобрался. И все стало работать. Необходимо путь в источнике файлов делать некешируемым [[!migxResourceMediaPath? &pathTpl=`assets/images/{id}/`]]
Код процессора который я написал для себя:
<?php require_once MODX_CORE_PATH .'components/migx/model/migx/migx.class.php'; class GetDataMIGxProcessor extends modProcessor{ public function initialize(){ $this->setDefaultProperties(array( 'tvname' => '', 'id' => 0, //id ресурса 'randomize' => 0, 'limit' => 0, 'nameMS' => '' //имя MediaSource )); return parent::initialize(); } private function GetPath(){ $this->modx->setPlaceholder('docid', $this->getProperty('id')); $source = $this->modx->getObject('modMediaSource', array('name'=>$this->getProperty('nameMS'))); $this->modx->resource = $this->modx->getObject('modResource', $this->getProperty('id')); $source->initialize(); $value = $source->getBaseUrl(); //unset($source); return $value; } private function FindFields(xPDOObject $object) { $migx = new MIGX($this->modx); $config_r = $object->get('input_properties'); $config = $config_r['configs']; // $q = $this->modx->getObject('migxConfig', array('name'=>$config)); $data = $this->modx->fromJSON(trim($q->get('formtabs'), '[]')); $res_field = array(); foreach($data['fields'] as $field){ if ($field['inputTVtype'] == 'image' || $field['inputTVtype'] == 'file') $res_field = $res_field + array($field['field']); } unset($migx); return $res_field; } private function GetTVValue($path){ $q = $this->modx->newQuery('modTemplateVar'); $q->innerJoin('modTemplateVarResource', 'v', 'v.tmplvarid = modTemplateVar.id'); $q->where(array('modTemplateVar.name'=> $this->getProperty('tvname'), 'v.contentid' => $this->getProperty('id'))); $q->select(array('v.*, modTemplateVar.input_properties')); $q->prepare(); $tv = $this->modx->getObject('modTemplateVar', $q); $keys = $this->FindFields($tv); $object = $this->modx->fromJSON($tv->get('value')); $list = array(); $index = 0; if ($this->getProperty('randomize') != 0) shuffle($object); foreach ($object as $tv){ for ($i = 0; count($keys) > $i; $i++){ if(array_key_exists($keys[$i], $tv)){ $tv[$keys[$i]] = implode("", array($path, $tv[$keys[$i]])); } } array_push($list, $tv); $index++; if ($this->getProperty('limit') != 0 && $this->getProperty('limit') == $index) break; } //$list['count'] = $index; return array("count" => $index, "object" => $list); } public function process(){ $path = $this->GetPath(); $tv_objects = $this->GetTVValue($path); return $tv_objects; } } return 'GetDataMIGxProcessor';
Планирую вскоре начать с этим разбираться. В принципе, насколько я понимаю, можно его подключать впараллель с жуком, поэтому в доработку проекта думаю его включить.
Сорри, но больше ничем не помогу. Придется вам копать сам сниппет getImageList, проверяя где какие значения проходят.
Но если вызывать его по id ресурса, так же некорректно выводит путь.
Он скорее всего плейсхолдер берет не переданного значения id, а id текущего документа.
Не совсем.
{processor action="web/getdata" ns="shopmodx" assign=value} {foreach $value.object as $obj} [[!getImageList?docid=`{$obj.id}`&tpl=`@CODE: <img src="[[+image]]" class="img-thumbnail img-item"/>`&limit=`1`&randomize=`true`&tvname=`gallery`]] {/foreach}
Пути некорректно выводит. Как будто id ресурса не меняется при каждом вызове getImageList. При этом имя изображения правильное. В консоли выводит как положено, при изменении id ресурса выводит путь тот который должен быть.
Ваш код я уверен что будет работать, т.к. в одном проекте я делал похожим образом и путь формировался корректно. Написал свой процессор с логикой как у getImageList. Но если вызывать его по id ресурса, так же некорректно выводит путь. При этом имена файлов правильные.
В итоге что, вопрос полностью решился или как?
Прошу прощения. Действительно имя TV параметра указал неверный.
Ваш код, у меня в консоли, выдает ошибку: Call to a member function getSource() on a non-object in Z:\domains\phoenix\core\cache\includes\elements\modsnippet\3.include.cache.php
Здесь два варианта: 1. Вы не меняли id документа, и документа с id 4 просто нет. $modx->resource = $modx->getObject('modResource', 4); 2. Нет указанного медиасурса.
Затем поставил modxSite, modxSmarty. И вышеприведенный код перестал работать. Удаление установленных пакетов не повлияло на работоспособность кода. Он просто перестал работать и все.
Великие сомнения на счет того, что эти пакеты при установке на что-то могли повлиять. Они просто не цепляют ядра. Тем не менее пришлите в личку доступ к админке, где установлены эти пакеты и этот код не работает. Я посмотрю.
Выяснил вот какую особенность. Поставил modx. Установил только Console, MIGX. Создал TV параметр MIGX. Следующий код выполнился успешно:
<?php $modx->switchContext('web'); $modx->resource = $modx->getObject('modResource', 1); $s = $modx->runSnippet('getImageList', array( 'tvname' => 'gallery', 'tpl' => '@CODE: <img src="[[+image]]" class="img-thumbnail img-item"/>', 'limit' => 1, 'randomize' => true, 'docid' => 1 )); print $s;
Затем поставил modxSite, modxSmarty. И вышеприведенный код перестал работать. Удаление установленных пакетов не повлияло на работоспособность кода. Он просто перестал работать и все.
То есть картинка выводится, но не работает рандом или что?
Картинка выводится та, но путь к ней не тот. Выводит так:
<img src="/assets/images/14/Oryx Antelope.jpg"/> <img src="/assets/images/14/52bef16f8b102.jpg"/> <img src="/assets/images/14/Humpback Whale.jpg"/>
А должен так:
<img src="/assets/images/14/Oryx Antelope.jpg"/> <img src="/assets/images/15/52bef16f8b102.jpg"/> <img src="/assets/images/16/Humpback Whale.jpg"/>
Ваш код, у меня в консоли, выдает ошибку: Call to a member function getSource() on a non-object in Z:\domains\phoenix\core\cache\includes\elements\modsnippet\3.include.cache.php
Я уже весь мозг себе сломал ((