[РЕШЕНО] Вопрос для академиков
Сразу оговорюсь, никакого сарказма, на мой взгляд задача действительно должна быть известна тем кто получил академическое образование по специальности программирование. Собственно задача.
Дан массив
[246 => 1, 267 =>2, 296 => 3, 308 => 4, 309 => 5]
Его ключи это id ресурсов, а значения отвечают за их сортировку, пусть будет menuidex. Нужно, чтобы при изменении значения например с ключом 308 с 4 на 2 получился массив
[246 => 1, 267 => 3, 296 => 4, 308 => 2, 309 => 5].
Я написал такое рашение
Дан массив
[246 => 1, 267 =>2, 296 => 3, 308 => 4, 309 => 5]
Его ключи это id ресурсов, а значения отвечают за их сортировку, пусть будет menuidex. Нужно, чтобы при изменении значения например с ключом 308 с 4 на 2 получился массив
[246 => 1, 267 => 3, 296 => 4, 308 => 2, 309 => 5].
Я написал такое рашение
<?php
switch ($modx->event->name) {
case 'OnDocFormSave':
$resource->set('publishedon', time());
$resource->save();
if($resource->get('class_key') == 'Ticket'){
$curPosition = $resource->getTVValue('position');
$positions = [];
if($resource->get('parent') == 73){
$resources = $modx->getIterator('modResource', array('class_key' => 'Ticket', 'id:!=' => $id, 'parent' => 73));
}
else{
$resources = $modx->getIterator('modResource', array('class_key' => 'Ticket', 'id:!=' => $id, 'parent:!=' => 73));
}
foreach($resources as $res){
$pos = $res->getTVValue('position');
if($pos){
$positions[$res->get('id')] = $pos;
}
}
if(in_array($curPosition,$positions)){
asort($positions);
foreach($positions as $id => $pos){
if($pos >= $curPosition){
$modx->log(1, print_r($curPosition,1));
$modx->log(1, print_r($pos,1));
$res = $modx->getObject('modResource', $id);
$res->setTVValue('position', $pos + 1);
$res->save();
$curPosition = $pos + 1;
}
}
}
//$modx->log(1, print_r($positions,1));
}
break;
}Но кажется мне, что в нём что-то не так, но вот что именно не могу понять. Комментарии: 12
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Если новое меньше старого, то делаем sql запрос, в котором у ресурсов (только с тем же parent конечно) с menuindex от нового до старого делаем menuindex=menuindex+1.
Если старое меньше нового — наоборот.
Вот пример кода из какого-то процессора (там не ресурсы, а свои объекты).
В этом случае нужно помнить, что не срабатывает сохранение TV-поля из плагина. Но оно в данном случае нам и не нужно.
Серьезно? На событие OnBeforeDocFormSave? skrinshoter.ru/s/290121/E2iWCCxq
>>>т.е. в плагин приходит уже новое значение.
В плагин на событие OnBeforeDocFormSave приходит новые значение, а вы заметили, откуда я извлекаю старое? Пытались мой пример протестить?
Тут всё наглядно, при работе с массивом можно каждый шаг дебажить и тестить. А так с наскока — перебирая ресурсы — мне, к примеру, тяжеловато сообразить
Массив для пункта 1 можно вытащить только перебрав $resources. И да, с массивом работать удобнее, но п.3 это проблема. Давайте псевдокод напишу
Но получается что если $newValue < $oldValue, то последнее значение не меняется.
Я предполагаю, что в этом массиве у тебя собраны сразу все необходимые id:
Если тебе не принципиально, чтобы первый индекс был единицой, то можно еще проще: