MODX Revo - cоздание ресурсов из фронтэнд
Дорогие друзья, здравствуйте, очень надеюсь на вашу поддержку, разрешить на первый взгляд вроде бы простую задачу. Для информации: новичек в MODX, на данный момент работаю с MODX Revolution 2.3.2-pl (traditional).
Ситуация такая, стараюсь реализовать функционал, добавления ресурсов пользователями из фронтэнд НЕОГРАНИЧЕННОЙ ВЛОЖЕННОСТИ. Что бы они сами могли создавать ресурс, и в него добавлять другие ресурсы, и так далее. Нашел сниппет в сети formit2resource и использую его в связке с FormIt.
Все вроде хорошо, но только до 2 уровня вложенности.
Например:
Вот вызов формит:
Ситуация такая, стараюсь реализовать функционал, добавления ресурсов пользователями из фронтэнд НЕОГРАНИЧЕННОЙ ВЛОЖЕННОСТИ. Что бы они сами могли создавать ресурс, и в него добавлять другие ресурсы, и так далее. Нашел сниппет в сети 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;
Помогите пожалуйста друзья! Комментарии: 7
Ну вот в форме:
а в сниппете код:
найти ресурс, который указан в поле resource_id
если он пустой — то создать новый ресурс
иначе — редактировать существующий.
отсюда и все идет…
кстати, если кто-то умный подменит и установит resource_id = 1, то будет преспокойно менять текст главной страницы вашего сайта =)
а вообще задача для новичка в MODx — сложная
<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 — сложная
Благодарю за ответ, я понял про resource_id, но он никогда не бывает пустым, почему сниппет редактирует его? И если я закоментирую
И как залатать можно дыру с resource_id = 1? Хотя форма доступна только авторизированым юзерам.
Или вообще лучше не использовать этот метод для создания ресурсов из фронтэнт?
else{
$doc->set('editedby', $modx->user->get('id'));
}
то значит все должно получиться, я в правильном направлении думаю?И как залатать можно дыру с resource_id = 1? Хотя форма доступна только авторизированым юзерам.
Или вообще лучше не использовать этот метод для создания ресурсов из фронтэнт?
Советую начать с modx.ws. Многие вопросы отпадут сами собой.
Спасибо, уже изучаю, но пока не решил свой вопрос, на все нужно время, само собой. Но я тут задал вопрос не о ресурсах с уроками MODX.
Ром, думаю, тебе здесь вряд ли помогут с этим вопросом. Ты представляешь себе, что будет, если ты закомментируешь это
else{
$doc->set('editedby', $modx->user->get('id'));
}
Сейчас попробую :))), повожусь все таки немного еще с этим сниппетом, с resource_id по поэкспериментирую, или буду искать другой. Но все же хочется с ним разобраться.
кстати, если кто-то умный подменит и установит resource_id = 1, то будет преспокойно менять текст главной страницы вашего сайта =)А Вы знаете решение этой проблемы? Политики доступа не решают ее.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.