Skip to content

Instantly share code, notes, and snippets.

@Fi1osof
Last active March 23, 2017 12:56
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save Fi1osof/531aa919507bcd7cd356 to your computer and use it in GitHub Desktop.
Save Fi1osof/531aa919507bcd7cd356 to your computer and use it in GitHub Desktop.
<?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
Copy link

andronex commented Apr 9, 2015

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

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

@andronex
Copy link

andronex 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