Я бы сделал заявку ресурсом с шаблоном "Заявка", т.к. этот объект уже имеет нужные поля и для каждой заявки у нас автоматически будет создаваться страница, а еще он привязан к пользователю-автору.
Далее - через FormIt можно реализовать добавление/редактирование ресурсов пользователями, для этого напишем hook вида:
<?php
$user_id = $modx->user->get('id');
$user_music = $modx->getCollection('modResource', array(
'template' => 3,
'createdby' => $user_id
));
if (count($user_music) >= 3) { // может добавить не больше 3
$errorMsg = 'Вы не можете загрузить больше 3 работ.';
$hook->addError('nomination_file',$errorMsg);
return false;
}
//$modx->log(xPDO::LOG_LEVEL_ERROR,print_r(count($user_music), true));
// Count IDs
$stmt = $modx->query("SELECT MAX(id) FROM {$modx->getTableName('modResource')}");
$maxId = (integer) $stmt->fetch(PDO::FETCH_COLUMN);
$stmt->closeCursor();
$id = $maxId + 1;
$aliasId = str_pad($id, 6, "0", STR_PAD_LEFT);
$allFormFields = $hook->getValues();
$pagetitle = $allFormFields['pagetitle'];
$parent = $allFormFields['parent'];
$tags = $allFormFields['tags'];
$filename = $allFormFields['nomination_file'];
//return;
$doc = $modx->newObject('modResource');
$doc->set('createdby', $user_id);
$doc->set('createdon', time());
$doc->set('menuindex',count($modx->getCollection('modResource',array('parent'=>$parent))));
$doc->set('pagetitle', $pagetitle);
$doc->set('parent', $parent);
$doc->set('alias', $aliasId."_".$doc->cleanAlias($pagetitle));
$doc->set('template', '3');
$doc->save();
if ($tv = $modx->getObject('modTemplateVar', array ('name'=>'musicItem'))) {
$tv->setValue($doc->get('id'), $path . $filename);
$tv->save();
}
if ($tv = $modx->getObject('modTemplateVar', array ('name'=>'tags'))) {
$tv->setValue($doc->get('id'), $tags);
$tv->save();
}
return true;
Это hook для добавления ресурса с 2 TV - файлом и тегами.
Внимание! Для сохранения файла на сервере нужен отдельный хук, этот - просто название в базу пишет.
Но у вас то, вроде не будет файлов?
А дальше - почти готово. Комменты через Quip. При желании рейтинг заявки - LikeDislike.
Я недавно разрабатывал схожий по функционалу проект, если не разберетесь - пишите.