Создание ресурса с помощью формы во фронтенде
Василий, здравствуйте! Дайте плз совет как грамотно решать мою задачу.
А задача такая: создание ресурса с помощью кастомной формы, без авторизации. Например, для того чтобы работодатель мог заполнить заявку по набору персонала на сайте университета.
Сейчас реализовал это так.
Исходная форма (для простоты и наглядности беру только два поля, одно — стандартное, другое — TV-параметр )
А так выглядит сниппет savevac:
Все вроде работает, но настораживает следующее. Во-первых нужно прописывать такие параметры, которые могут спокойно генерироваться по умолчанию, например publishedon. Во-вторых, насколько понял, это большая дырка в безопасности. Вы рекомендуете для подобных вещей всегда использовать runProcessor. Можете набросать примерный код как это будет в моем случае?
P.S. У меня так, но не работает
Вашу статью читал, и код minishop разбирал, но все равно не понял:(
Получается что нужно создавать системного пользователя с надлежащими правами и делать
А задача такая: создание ресурса с помощью кастомной формы, без авторизации. Например, для того чтобы работодатель мог заполнить заявку по набору персонала на сайте университета.
Сейчас реализовал это так.
Исходная форма (для простоты и наглядности беру только два поля, одно — стандартное, другое — TV-параметр )
<form id="vacancyForm" action="" method="post">
Название: <input type="text" name="vacname" /><br /> // пойдет в pagetitle
Отдел: <input type="text" name="depart" /><br /> //пойдет в TV
<input type="submit" name="submit1" value="Отправить" />
А так выглядит сниппет savevac:
<?php
$parent = 20;
$template = 6; // определяем родительский ресурс и шаблон
$publishedon = date('Y-m-d H:i:s');
$newResource = $modx->newObject('modResource');
$newResource->set('pagetitle',$_POST['vacname']);
$newResource->set('parent',$parent);
$newResource->set('template',$template);
$newResource->set('published',1);
$newResource->set('publishedon',$publishedon);
$id = $newResource->get('id');
$newResource->save();
if ($res = $modx->getObject('modResource', $id)) {
$modx->resource->set('depart', null);
$res->setTVValue(1, $_POST['depart']);
die;
}
$modx->cacheManager->refresh();
return false;
?>
Все вроде работает, но настораживает следующее. Во-первых нужно прописывать такие параметры, которые могут спокойно генерироваться по умолчанию, например publishedon. Во-вторых, насколько понял, это большая дырка в безопасности. Вы рекомендуете для подобных вещей всегда использовать runProcessor. Можете набросать примерный код как это будет в моем случае?
P.S. У меня так, но не работает
if (!$modx->hasPermission('edit_document')) {
return $modx->error->failure($modx->lexicon('access_denied'));
}
$fields = array(
'pagetitle' => $_POST['vacname'],
'depart' =>$_POST['depart'],
'template' => 6,
);
$response = $modx->runProcessor('resource/create', $fields);
if ($response->isError()) {
return $modx->error->failure($response->getMessage());
}
Вашу статью читал, и код minishop разбирал, но все равно не понял:(
Получается что нужно создавать системного пользователя с надлежащими правами и делать
$modx->runProcessor('security/login', array('username' => 'admin', 'password' => '123456'))
? Также не понял с помощью какого процессора создаются TV-параметры. Комментарии: 5
Попробуйте приспособить Tickets для своих нужд.
Создание документа через процессоры как раз Василий Наумкин и описаны в статье MODX_API_MODE и процессоры. Что касается процессора который отвечает за создание TV то это element/tv/create. Пример использования:
$example = $modx->runProcessor('element/tv/create', array(
'name' => 'example',
'caption' => $resource->get('pagetitle'),
'type' => 'text',
'category' => 9,
'description' => 'example'
));
.
Спасибо, abba abadon. Действительно — рабочий пример создания любых ресурсов от имени админа сайта находится вот тут.
Но мне не ясно, зачем тебе создавать ресурсы, если работодатель заполняет форму? Не лучше ли сохранять эти данные в отдельную таблицу, по которой можно будет организовать поиск?
Если так — то самый простой вариант, это сделать малюсенький компонент при помощи modExtra, а данные в таблицу закидывать через хук FormIt — заодно и валидация будет, и email уведомления о новой записи.
Если же надо прям создавать ресурсы — крайне советую использовать Tickets, ибо он фильтрует разные XSS, теги MODX и прочие угрозы, которые юные хакеры могут засунуть в новый ресурс. Также, он форматирует и типографирует текст, и тебе самому это делать не придётся.
Tickets работает только с авторизованными юзерами, что решается легко и просто при помощи HybridAuth.
Но мне не ясно, зачем тебе создавать ресурсы, если работодатель заполняет форму? Не лучше ли сохранять эти данные в отдельную таблицу, по которой можно будет организовать поиск?
Если так — то самый простой вариант, это сделать малюсенький компонент при помощи modExtra, а данные в таблицу закидывать через хук FormIt — заодно и валидация будет, и email уведомления о новой записи.
Если же надо прям создавать ресурсы — крайне советую использовать Tickets, ибо он фильтрует разные XSS, теги MODX и прочие угрозы, которые юные хакеры могут засунуть в новый ресурс. Также, он форматирует и типографирует текст, и тебе самому это делать не придётся.
Tickets работает только с авторизованными юзерами, что решается легко и просто при помощи HybridAuth.
Спасибо за наводку на Tickets, действительно подходящая штука. Насчет отдельной таблицы еще не решил, вариант такой рассматриваю. Хотелось бы предусмотреть возможность легкого редактирования самим же работодателем (или на крайняк администратором) вакансии в случае например ошибки в заполнении или обновления данных.Также должна быть возможность «снять с публикации» вакансию. Если все данные будут записываться в отдельную таблицу, то нужно разрабатывать и отдельный компонент для их администрирования через вкладку Компоненты и допиливать getResources для отображения, и HybridAuth для доступа к этой таблице. Хочется не тратить время и не изобретать велосипед, если уже есть готовое решение:)
Кстати говоря, с HybridAuth возникла небольшая проблемка. Создал новый вопрос.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.