MODX Revo - cоздание ресурсов из фронтэнд

Дорогие друзья, здравствуйте, очень надеюсь на вашу поддержку, разрешить на первый взгляд вроде бы простую задачу. Для информации: новичек в 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;"></textarea>
									
<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;
Помогите пожалуйста друзья!
Роман
17 января 2015, 14:05
modx.pro
2
2 915
0

Комментарии: 7

Наумов Алексей
17 января 2015, 17:45
0
Ну вот в форме:
<input type="hidden" name="resource_id" value="[[*id]]" />
resource_id — вы ставите id ТЕКУЩЕГО документа, на котором форма расположена

а в сниппете код:

$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'));
}
построчно:
найти ресурс, который указан в поле resource_id
если он пустой — то создать новый ресурс
иначе — редактировать существующий.

отсюда и все идет…

кстати, если кто-то умный подменит и установит resource_id = 1, то будет преспокойно менять текст главной страницы вашего сайта =)

а вообще задача для новичка в MODx — сложная
    Роман
    17 января 2015, 21:15
    0
    Благодарю за ответ, я понял про resource_id, но он никогда не бывает пустым, почему сниппет редактирует его? И если я закоментирую
    else{
        $doc->set('editedby', $modx->user->get('id'));
    }
    то значит все должно получиться, я в правильном направлении думаю?

    И как залатать можно дыру с resource_id = 1? Хотя форма доступна только авторизированым юзерам.
    Или вообще лучше не использовать этот метод для создания ресурсов из фронтэнт?

      Сергей Шлоков
      18 января 2015, 13:49
      0
      Советую начать с modx.ws. Многие вопросы отпадут сами собой.
        Роман
        18 января 2015, 14:13
        0
        Спасибо, уже изучаю, но пока не решил свой вопрос, на все нужно время, само собой. Но я тут задал вопрос не о ресурсах с уроками MODX.
          Сергей Шлоков
          18 января 2015, 14:59
          0
          Ром, думаю, тебе здесь вряд ли помогут с этим вопросом. Ты представляешь себе, что будет, если ты закомментируешь это
          else{
              $doc->set('editedby', $modx->user->get('id'));
          }
            Роман
            18 января 2015, 15:16
            0
            Сейчас попробую :))), повожусь все таки немного еще с этим сниппетом, с resource_id по поэкспериментирую, или буду искать другой. Но все же хочется с ним разобраться.
      Rrp2010
      27 апреля 2016, 10:28
      0
      кстати, если кто-то умный подменит и установит resource_id = 1, то будет преспокойно менять текст главной страницы вашего сайта =)
      А Вы знаете решение этой проблемы? Политики доступа не решают ее.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      7