Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
<?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;
}
@andronex

This comment has been minimized.

Copy link

commented Apr 9, 2015

Николай, подскажи, пожалуйста, откуда берётся в 162 переменная $tv_table ?
И ещё такой вопрос - теперь в ресурсах и чанках обычные плейсхолдеры для этих кастомизированных полей корректно работать не будут? Нужно только через сниппеты добывать данные полей типа такого:

$resource = $modx->getObject('modResource', $modx->resource->id);
return $resource->article_type;
@andronex

This comment has been minimized.

Copy link

commented Apr 9, 2015

Насчёт переменной понял - посмотрел предыдущие версии кода.
Ты забыл вот эту строку вставить перед 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
You can’t perform that action at this time.