-
-
Save Fi1osof/531aa919507bcd7cd356 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
OnBeforeDocFormSave | |
OnDocFormSave | |
OnResourceTVFormRender | |
*/ | |
$tvs = array( | |
1 => "tags", | |
2 => "image", | |
); | |
switch($modx->event->name){ | |
/* | |
Рендеринг ТВшек | |
*/ | |
case 'OnResourceTVFormRender': | |
if(!$document = $modx->getObject('modResource', $resource)){ | |
$modx->log(xPDO::LOG_LEVEL_ERROR, "Не был получен документ"); | |
return; | |
} | |
$categories = & $scriptProperties['categories']; | |
foreach($categories as $c_id => & $category){ | |
foreach($category['tvs'] as & $tv){ | |
if(array_key_exists($tv->id, $tvs)){ | |
$field = $tvs[$tv->id]; | |
switch($tv->id){ | |
case '1': // Тэги. Для примера | |
$q = $modx->newQuery('modResourceTag'); | |
$q->select(array( | |
"GROUP_CONCAT(distinct tag_id) as tags", | |
)); | |
$q->where(array( | |
"resource_id" => $document->id, | |
)); | |
$tags = $modx->getValue($q->prepare()); | |
$value = str_replace(",", "||", $tags); | |
break; | |
default: $value = $document->$field; | |
} | |
$tv->value = $value; | |
$tv->relativeValue = $value; | |
$inputForm = $tv->renderInput($document, array('value'=> $tv->value)); | |
$tv->set('formElement',$inputForm); | |
} | |
} | |
} | |
break; | |
// Перед сохранением документа | |
case 'OnBeforeDocFormSave': | |
if(!$resource = & $scriptProperties['resource']){ | |
$modx->log(xPDO::LOG_LEVEL_ERROR, "Не был получен документ"); | |
return; | |
} | |
/* | |
Тэги. | |
Перед сохранением документа мы получим все старые | |
теги и установим им active = 0. | |
Всем актуальным тегам будет установлено active = 1. | |
После сохранения документа в событии OnDocFormSave мы удалим все не активные теги | |
*/ | |
if($resource->tvs){ | |
foreach($tvs as $tv_id => $field){ | |
$var = "tv{$tv_id}"; | |
// if(isset($resource->$var)){ | |
switch($tv_id){ | |
case '1': | |
$tags = array(); | |
foreach((array)$resource->Tags as $tag){ | |
$tag->active = 0; | |
$tags[$tag->tag_id] = $tag; | |
} | |
if(!empty($resource->$var)){ | |
foreach((array)$resource->$var as $tv_value){ | |
if($tv_value){ | |
if(!empty($tags[$tv_value])){ | |
$tags[$tv_value]->active = 1; | |
} | |
else{ | |
$tags[$tv_value] = $modx->newObject('modResourceTag', array( | |
"tag_id" => $tv_value, | |
)); | |
} | |
} | |
} | |
} | |
$resource->Tags = $tags; | |
$tags_ids = array(); | |
foreach($resource->Tags as $tag){ | |
if($tag->active){ | |
$tags_ids[] = $tag->tag_id; | |
} | |
} | |
$resource->tags = ($tags_ids ? implode(",", $tags_ids) : NULL); | |
break; | |
/* | |
Флажки (чекбоксы) | |
*/ | |
case 15: | |
case 16: | |
case 17: | |
case 18: | |
$resource->$field = (int)reset($resource->$var); | |
break; | |
default: | |
$resource->$field = $resource->$var; | |
} | |
// } | |
} | |
} | |
break; | |
/* | |
Сохранение документа | |
*/ | |
case 'OnDocFormSave': | |
/* | |
Удаляем все не активные теги | |
*/ | |
$modx->removeCollection('modResourceTag',array( | |
'active' => 0, | |
)); | |
/* | |
Удаляем TV, так как они сохраняются в системную таблицу | |
*/ | |
if($tvs){ | |
$modx->removeCollection('modTemplateVarResource',array( | |
'tmplvarid:in' => array_keys($tvs), | |
)); | |
// Сбрасываем автоинкримент | |
$sql = "ALTER TABLE {$tv_table} auto_increment = 1"; | |
$modx->prepare($sql)->execute(); | |
} | |
break; | |
} |
Насчёт переменной понял - посмотрел предыдущие версии кода.
Ты забыл вот эту строку вставить перед 162 строкой:
$tv_table = $modx->getTableName('modTemplateVarResource');
P.S. Да и плейсхолдерами разобрался. Просто у меня сделаны были названия TV и кастомных полей одинаковыми. Вот они и конфликтовали - MODX пытался выводить значения TV-шек, а не полей из системной таблицы. Если названия кастомных полей и TV полей не совадают, то парсер MODX всё корректно выводит.
Спасибо за инфу!!! Она оказалась очень кстати для меня))
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Николай, подскажи, пожалуйста, откуда берётся в 162 переменная $tv_table ?
И ещё такой вопрос - теперь в ресурсах и чанках обычные плейсхолдеры для этих кастомизированных полей корректно работать не будут? Нужно только через сниппеты добывать данные полей типа такого: