Dolce

Dolce

С нами с 30 июня 2016; Место в рейтинге пользователей: #107
Dolce
28 апреля 2018, 11:35
0
Сделал с шаблонами
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
// Тв из сниппета
$tvInput = explode(',',$tvs);
//Номер фотографии, елси нужно указать в атрибуте alt
$idx = 0;

// Шаблоны из сниппета
$innerTpl = $innerTpl;
$outerTpl = $outerTpl;

//Результат на выход
$output = "";

$tvList = $modx->getCollection('modTemplateVarResource',[
    'contentid' => $id,
    'tmplvarid:IN' => $tvInput
    ]);
    
  
  
if (!empty($tvList)){
   
    foreach ($tvList as $tv){
        $v = $tv->get('value');
            //Записываем на выход значение в плейсхолдер и запихиваем его в шаблон inner
        	$output .= $modx->getChunk($innerTpl, [
        		'value' => $v,
        		'idx' => ++$idx
        	]);
    }
    $output = $modx->getChunk($outerTpl, [
        		'inner' => $output
        	]);
   
    
}
return $output;
Dolce
21 апреля 2018, 15:37
0
Рабочий плагин, вроде проблем нет
<?php
switch($modx->event->name){
    case 'OnDocFormSave':
    $currency_resTpl = $resource->get('template'); //Шаблон текущего ресурса
    $cat_template = 2;//Шаблон категории


    // Если шаблоны совпадают
    if($currency_resTpl == $cat_template){
        $currency_id = $resource->get('id'); // получаем id текущего ресурса
        $listTv = 62; //id tv списка
        $activTpl = 21;//id активного шаблона, выбранного в TV
        $passivTpl = 3;//id пассивного шаблона, присваеваемого ресурсу, если он не выбран в tv у родителя
        //Все дети в категории
        $docs = $modx->getCollection('modResource', array(
            'parent' => $currency_id
        ));
        
        // Если дети есть
        if($docs){
          $arrAllchildren = []; //Массив с id детей в категории
          foreach($docs as $doc){
              $id = $doc->get('id'); //Получаем id ребенка
              array_push($arrAllchildren, $id); //добавляем id  в конец массива
          };
        }else{
          return;
        }
        
        
        
        //Получаем объект  tv детей категории
        $outStock = $modx->getObject('modTemplateVarResource', array(
              'tmplvarid' => $listTv,
              'contentid' => $currency_id
        ));
        
        // Если TV выбраны
        if ($outStock) {
        
            $stringValue = $outStock->get('value'); //Получаем строку id выбраных в tv детей категории 
            $arr = explode("||", $stringValue); //Массив с id tv выбранных в категории
        
            $dif = array_diff($arrAllchildren, $arr);
        
            foreach($arr as $k){
                    $res = $modx->getObject('modResource',$k);
                    $res->set('template', $activTpl);
                    $res->save();
                 }
        
            foreach($dif as $k){
                    $res = $modx->getObject('modResource',$k);
                    $res->set('template', $passivTpl);
                    $res->save();
                 }
        
        }else{ //Если невыбран ни один ребенок      
            foreach($arrAllchildren as $k){
                            $res = $modx->getObject('modResource',$k);
                            $res->set('template', $passivTpl);
                            $res->save();
                    }
        }
    }


       
}
Dolce
21 апреля 2018, 14:30
0
Получилось написать сниппет для теста, теперь буду делать плагин, вот код — навернякак кривой и избыточный, но знаний пока мало, может кто-нибудь сможет поправить:
<?php
$page_id = 1623; //id страницы категории
$workTv = 62; //id tv списка

//Все дети в категории
$docs = $modx->getCollection('modResource', array(
    'parent' => $page_id
));

// Если дети есть
if($docs){
  $arrAllchildren = []; //Массив с id детей в категории
  foreach($docs as $doc){
      $id = $doc->get('id'); //Получаем id ребенка
      array_push($arrAllchildren, $id); //добавляем id  в конец массива
  };
}else{
    return;
}

//Получаем объект  tv детей категории
$outStock = $modx->getObject('modTemplateVarResource', array(
      'tmplvarid' => $workTv,
      'contentid' => $page_id
));

// Если TV выбраны
if ($outStock) {

    $stringValue = $outStock->get('value'); //Получаем строку id выбраных в tv детей категории 
    $arr = explode("||", $stringValue); //Массив с id tv выбранных в категории

    $dif = array_diff($arrAllchildren, $arr); //сравниваем массивы и записываем отличающиеся id

    foreach($arr as $k){
            $res = $modx->getObject('modResource',$k);
            echo "($k)";
            $res->set('template', 21);
            $res->save();
         }

    foreach($dif as $k){
            $res = $modx->getObject('modResource',$k);
             echo "[$k]";
            $res->set('template', 3);
            $res->save();
         }

}else{
    return;
};
Dolce
02 апреля 2018, 15:05
0
Реализовал так, на своем примере:
<?
if(!$docs = $modx->getCollection('modResource', array(
    'template' => 3
    
    
))){return;}

foreach($docs as $doc){
    $introtext = $doc->get('introtext');
    $introtext = str_replace("; ", ";</li><li>", $introtext);    
	$introtext = "<li>" . $introtext . "</li>";    
    $doc->set('introtext',$introtext);
    $doc->save();
}
А для ТВ, чуть по другому:
<?
if(!$docs = $modx->getCollection('modResource', array(
    'template' => 3
    
    
    
))){return;}


foreach($docs as $doc){
    $ch = $doc->getTVValue('characteristics');
    $ch = preg_replace('/<tr([^>]*)>/', '<tr class="table__row">', $ch); //мои манипуляции с полем
    $ch = preg_replace('/<td([^>]*)>/', '<td class="table__cell">', $ch); //мои манипуляции с полем
    //echo $ch;
    $doc->setTVValue('characteristics', $ch);
    $doc->save();
}
Dolce
31 марта 2018, 16:39
0
Да, да, я за это тоже подумал, просто это «быстро» решение, у меня знаний мало, нужно было разбираться, как шаблоны передать, мог бы не успеть. Но так, как знаний у меня мало, то я как раз таки это все планирую переписать, тем самым обучится=)) Тут еще мне нужно аутер тпл сделать, для того что бы, если нет дополнительных фотографий не выводился и блок в целом, то есть вот это тоже нужно забрать в сниппет и не выводить если пусто, как-то так должно выглядеть:
<div class="wrap">
 <div class="wrap__header">
<span class="wrap__title">Фото</span>
</div>
 [[+inner]]
</div>
Dolce
31 марта 2018, 16:35
+1
Да нет, все в порядке, ответили — помогли, а это многого стоит, ведь помогают не всегда=)
Dolce
30 марта 2018, 20:28
0
Я не совсем что бы и новичок, про параметры по умолчанию знаю, я же и написал, что если не указывать параметры то выводится все что вложено в категории где вызывается сниппет(ну сейчас я уточнил конечно более конкретно)
Реализовал на getProducts, с параметром &parents=`-1`, но сейчас переписал на pdoResources, все работает по вашему совету. Спасибо за помощь!
Я просто помню в каких-то сниппетах, давно это было, не скажу точно в каких, возможно в getResources, если на вход не передавать id ресурсов то сниппет ничего не вернет, по этому и смутился=)))
А насчет кеширования, просто пробовал разные варианты, где-то скопировал такой вызов=)

Еще раз спасибо=)
Dolce
30 марта 2018, 13:56
0
Что в итоге получилось:
Сниппет checkImg:
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
$tvInput = explode(',',$tvs);

$tvList = $modx->getCollection('modTemplateVarResource',[
    'contentid' => $id,
    'tmplvarid:IN' => $tvInput
    ]);
    
  
  
if (!empty($tvList))
{
    echo '<div class="wrap">';
        echo '<div class="wrap__header">';
        echo '<span class="wrap__title">Фото</span>';
       echo '</div>';
        foreach ($tvList as $tv){
             $v = $tv->get('value');
             
             echo '<a class="fancybox gallery__thumbItem" rel="gallery1" href="' . $v . '" title="" data-fancybox="images">';
             echo '<img src="' .  $v  . '" title="" alt="" itemprop="image" class="thumbsImg">';      
             echo '</a>';
             
        }
       
        echo '</div>';
    
   
    
    
}
Принимает TV:
[[!checkImg? &tvs=`37,38,39,41`]]
Спасибо за помощь
Dolce
30 марта 2018, 12:50
0
Огромное спасибо, все работает!
Галерею ставить не хочется, потому что уже у 2к ресурсов заданы фото через TV, а теперь у некоторых ресурсов появляются по несколько фотографий, их будет не так много, не хочется перезакреплять все фотографии заново, по этому и хотелось какое-то простое решение=)
Dolce
30 марта 2018, 12:06
0
Вспомнилось что while для массивов не подходит, только foreach
Dolce
23 марта 2018, 20:54
0
Пробовал просто без параметра &sortby, не работало, а вот с пустым значением все как нужно выводит. Спасибо
Dolce
17 февраля 2018, 14:57
0
Вроде работает вот так
$where->where(array(
                "template:IN" => [4,11],
                'published' => 1
                
));
Dolce
17 февраля 2018, 14:54
0
Вот так еще пробую, тоже не работает
$where->where(array
                "template" => 4,
                "OR:template:=" => 11
                
));
Dolce
12 февраля 2018, 16:42
0
Спасибо, еще проще выходит
Dolce
12 февраля 2018, 15:58
0
Проблему так и не решил
Dolce
12 февраля 2018, 15:52
0
Спасибо, все работает как нужно!
Dolce
03 февраля 2018, 19:42
0
Большое спасибо, буду копать в эту сторону
Dolce
07 декабря 2017, 15:10
0
Спасибо! id сохраню
Dolce
19 октября 2017, 12:38
0
Проблема решена. Не у всех ресурсов стоял включенным параметр — доступен для поиска, если этот параметр выключен то и в сайтмап страница попадать не будет — что логично