Дорогие друзья, здравствуйте, очень надеюсь на вашу поддержку, разрешить на первый взгляд вроде бы простую задачу. Для информации: новичек в MODX, на данный момент работаю с MODX Revolution 2.3.2-pl (traditional).
Ситуация такая, стараюсь реализовать функционал, добавления ресурсов пользователями из фронтэнд НЕОГРАНИЧЕННОЙ ВЛОЖЕННОСТИ. Что бы они сами могли создавать ресурс, и в него добавлять другие ресурсы, и так далее. Нашел сниппет в сети formit2resource и использую его в связке с FormIt.
Все вроде хорошо, но только до 2 уровня вложенности.
Например: РЕСУРС ОТЕЦ Ресурс пользователя 1 Ресурс пользователя 1 Ресурс пользователя 2 Ресурс пользователя 2
И если попробовать добавить подресурс для ресурса 2 уровня, то он его просто перепишет и ничего не вложит. Как решить эту проблему? Как лучше сделать? Куда копать?
Вот вызов формит:
[[!FormIt? &hooks=`formit2resource,redirect` &redirectTo=`[[*id]]` &template=`15` ]]
Вот сама форма:
<form id="add" action="[[~[[*id]]]]" method="post"> <input type="hidden" name="resource_id" value="[[*id]]" /> <input type="hidden" name="parent" id="parent" value="[[*id]]" /> <input type="hidden" name="published" id="published" value="1" /> <input type="hidden" name="hidemenu" id="hidemenu" value="1" /> <input type="hidden" name="cacheable" id="cacheable" value="0" /> Название: <input type="text" name="pagetitle" id="pagetitle" class="form-control" value="[[+fi.pagetitle]]" /> Описание: textarea id="content" name="content" class="form-control" style="height:150px;" <input type="submit" name="submit" style="margin-top:20px;" class="btn btn-yellow" value="Добавить" /> </form>
А вот сам сниппет formit2resource:
<?php $doc = $modx->getObject('modResource',array('id'=>$hook->getValue('resource_id'))); if (empty($doc)){ $doc = $modx->newObject('modResource'); $doc->set('createdby', $modx->user->get('id')); } else{ $doc->set('editedby', $modx->user->get('id')); } $allFormFields = $hook->getValues(); foreach ($allFormFields as $field=>$value) { if ($field !== 'spam' && $field !== 'resource_id'){ $doc->set($field, $value); } } $alias = $doc->cleanAlias($fields['pagetitle']); if($modx->getCount(modResource, array('alias'=>$alias))!= 0) { $count = 1; $newAlias = $alias; while($modx->getCount(modResource, array('alias'=>$newAlias))!= 0) { $newAlias = $alias; $newAlias .= '-' . $count; $count++; } $alias = $newAlias; } $doc->set('alias',$alias); $doc->set('template', $template); $doc->save(); foreach ($allFormFields as $field=>$value) { if (!empty($value) && $tv = $modx->getObject('modTemplateVar', array ('name'=>$field))) { /* handles checkboxes & multiple selects elements */ if (is_array($value)) { $featureInsert = array(); while (list($featureValue, $featureItem) = each($value)) { $featureInsert[count($featureInsert)] = $featureItem; } $value = implode('||',$featureInsert); } $tv->setValue($doc->get('id'), $value); $tv->save(); } } $modx->cacheManager->refresh(); return true;
Помогите пожалуйста друзья!
Смотрите, вот у вас в сниппете идет получение документа:
$doc = $modx->getObject('modResource',array('id'=>$hook->getValue('resource_id')));
А в форме у вас есть поле:
<input type="hidden" name="resource_id" value="[[*id]]" />
Конечно, в форму добавляется ID текущего документа, и он апдейтится, а не создается новый.
Уберите поле resource_id, если создаваться должен, а не обновляться.
А возможно добавлять ресурсы, будучи не авторизованным пользователем?