Помогите с логикой :( pdopage и formit
Всем привет! Немного запуталась. У меня есть форма на formit, которая отправляет пользовательские данные в базу (создана отдельная таблица). Пользователь входит через Login. Суть вопроса в чем. Я хочу эту форму также заполнять placeholder, которые вытаскиваются из базы, если они там есть и тем самым позволять пользователю изменить или отредактировать данные. Эти плейсхолдеры я получаю через pdopage. Введенные раньше данные показываются и редактируются хорошо.
Но! Если данных в базе еще нет, то естественно pdopage не работает и форма не выводится…
[[!pdoPage?
&class=`Class`
&element=`getClass`
&tpl=`Form.full`
&where=`{«created_by»:[[!+modx.user.id]]}`
]]
Form.full — это чанк с выводом формы. Не знаю как сделать такую логику — чтобы если пользователь вошел на сайт и у него нет данных, он бы в форме мог их заполнить и отправить, или если же уже есть данные, то они соответственно будут сразу выводиться в форме… Думала, может быть в formit надо сделать какой то прехук, который будет или выводить пустую форму или отрабатывать pdopage. Но кажется, что решение есть проще… Спасибо всем!
Но! Если данных в базе еще нет, то естественно pdopage не работает и форма не выводится…
[[!pdoPage?
&class=`Class`
&element=`getClass`
&tpl=`Form.full`
&where=`{«created_by»:[[!+modx.user.id]]}`
]]
Form.full — это чанк с выводом формы. Не знаю как сделать такую логику — чтобы если пользователь вошел на сайт и у него нет данных, он бы в форме мог их заполнить и отправить, или если же уже есть данные, то они соответственно будут сразу выводиться в форме… Думала, может быть в formit надо сделать какой то прехук, который будет или выводить пустую форму или отрабатывать pdopage. Но кажется, что решение есть проще… Спасибо всем!
Комментарии: 10
Я не знаю, как выглядит у вас сниппет редактирования данных, но можно сделать как-то так:
if (!$modx->getObject('ExamSheet', array('uid' => $modx->user->id))) {
$processor = 'sheet/create';
} else {
$processor = 'sheet/update';
}
$processorProps = array('processors_path' => $modx->getOption('core_path')
. 'components/exam/processors/');
$response = $modx->runProcessor($processor, $_POST, $processorProps);
if ($response->isError()) {
$hook->addError('process_error', $response->getMessage());
return false;
}
return true;
Илья, спасибо за ответ. Я поняла логику, что если какой-то пользователь, то вызываем процесс создания записи, а иначе обновляем.
Но мне кажется, что задачу я плохо сформулировала. Как раз редактирование в форме у меня работает хорошо. Суть в том, что если у меня нет записи в базе данных у какого-то пользователя, то pdopage у которого вызов в чанке формы заполнения-редактирования не срабатывает, то есть не выводит просто форму. С редактированием то все хорошо, вопрос именно в первом наполнении. Я сейчас пробую разобраться с фильтрами ввода-вывода. Думаю, что например условие — если то pdopage иначе просто вывод пустой формы для заполнения. Даже не знаю в верном ли направлении думаю. :(
Но мне кажется, что задачу я плохо сформулировала. Как раз редактирование в форме у меня работает хорошо. Суть в том, что если у меня нет записи в базе данных у какого-то пользователя, то pdopage у которого вызов в чанке формы заполнения-редактирования не срабатывает, то есть не выводит просто форму. С редактированием то все хорошо, вопрос именно в первом наполнении. Я сейчас пробую разобраться с фильтрами ввода-вывода. Думаю, что например условие — если то pdopage иначе просто вывод пустой формы для заполнения. Даже не знаю в верном ли направлении думаю. :(
pdoPage нужен для постраничности… А вы его для одной формы используете, не надо так)) Возьмите pdoResource тогда уж)
А зачем вообще использовать pdoPage, если можно в FormIt использовать &preHooks=`getClass` и заполнять так $hook->setValue('email', $email); или через $modx->setPlaceholders ($modx->setPlaceholder)
Чувствую, что хожу вокруг и около, не могу сообразить :( Илья Уткин прав и Petro тоже. Лев Вербицкий — да, спасибо, я только учусь. Помогите, пожалуйста, я уже в отчаянии!
Смотрите вот у меня как.
1. Formit для введения пользовательских данных. Она же должна редактировать данные, если они уже есть.
2. Перед вызовом формы есть сниппет getMuzei который вбивает пользовательские данные
Смотрите вот у меня как.
1. Formit для введения пользовательских данных. Она же должна редактировать данные, если они уже есть.
2. Перед вызовом формы есть сниппет getMuzei который вбивает пользовательские данные
if ($_GET['Muzei'] && $Muzei = $modx->getObject('VogMuzei', $_GET['Muzei'])) {
if ($Muzei->get('created_by') == $modx->user->id) {
$modx->setPlaceholders($Muzei->toArray());
}
}
3. В самой форме есть вызов сниппета, который редактирует, обновляет или добавляет данные.<?php
if (!$_POST['Muzei'])
{
$processor = 'vogmuzei/create';
} else {
$_POST['id'] = $_POST['Muzei'];
$modx->setPlaceholder('id', $_POST['id']);
if ($_POST['remove']) {
$processor = 'vogmuzei/remove';
} else {
$processor = 'vogmuzei/update';
}
}
$processorProps = array('processors_path' => $modx->getOption('core_path')
. 'components/Muzei/processors/');
$response = $modx->runProcessor($processor, $_POST, $processorProps);
if ($response->isError()) {
$hook->addError('process_error', $response->getMessage());
return false;
}
return true;
Я вижу, что хожу вокруг и около и мне не хватает какой-то мелочи, которая будет очень и очень смешно. Может быть мне достаточно на форму сделать ссылку какую-то, которая передаст id пользователя? Не знаю:( Суть проблемы в том, что пользователь входит в свой кабинет и может открыть форму для добавления данных. НО если у него уже есть данные, то они должны отображаться в форме. А если нет данных, то он может их ввести. Я так понимаю, что нам надо проверить есть ли у пользователя данные в базе и если нет, то просто показать пустую форму, иначе вывести их. Что мне делать? :(
О работе с объектами MODX можно почитать здесь. Здесь и о пользователях и о ресурсах…
if ($_GET['Muzei']) {
$Muzei = $modx->getObject('VogMuzei', $_GET['Muzei']);
}
if (!$Muzei) {
$Muzei = $modx->newObject('VogMuzei', array('created_by' => $modx->user->id));
$Muzei->save();
}
if ($Muzei->get('created_by') == $modx->user->id) {
$modx->setPlaceholders($Muzei->toArray());
}
Всем привет снова!
Сначала, скажу спасибо большое всем, особенно Илье Уткину. Не ожидала такой поддержки. Все таки, паника, дело плохое.
Не уверена, что решение кошерное, но работает. Быть может кто-то еще советы даст.
Проблема заключалась в том, что у меня в меню не было нормальной ссылки в которой бы передавались параметры полученного объекта.
Вопрос решила так: написала свой небольшой сниппет, который передает параметры зарегистрированного пользователя в ссылку и она ведет на форму, где заполняются плейсхолдеры, по приведенному выше мною коду. Если у пользователя нет данных, то ссылка, конечно, пустая.
Код вызова ссылки, ведущей на форму, со сниппетом
Сначала, скажу спасибо большое всем, особенно Илье Уткину. Не ожидала такой поддержки. Все таки, паника, дело плохое.
Не уверена, что решение кошерное, но работает. Быть может кто-то еще советы даст.
Проблема заключалась в том, что у меня в меню не было нормальной ссылки в которой бы передавались параметры полученного объекта.
Вопрос решила так: написала свой небольшой сниппет, который передает параметры зарегистрированного пользователя в ссылку и она ведет на форму, где заполняются плейсхолдеры, по приведенному выше мною коду. Если у пользователя нет данных, то ссылка, конечно, пустая.
Код вызова ссылки, ведущей на форму, со сниппетом
<a href="[[~8?&Muzei=`[[urlMuzei]]`]]" Заполнить или отредактировать данные</a>
Сам сниппет urlMuzei, получающий объект$userid = $modx->user->id;
$where = array(
'created_by' => $userid
);
$res = $modx->getObject('VogMuzei', $where);
if (!is_object($res))
{
return false;
}
$output = $res->get('id');
return $output;
Может кому из таких же новичков, как я, пригодится. Решение наивное может быть… Но вроде работает. Надо курить мануалы и долго думать :)
Если я правильно понял, то каждый пользователь имеет только одну запись в таблице. Если это так, то тогда можно обойтись и без GET параметров. А сниппет getMuzei можно поправить и подключить в preHooks:
$placeholderPrefix = $modx->getOption('placeholderPrefix', $scriptProperties, 'fi.');
$where = array(
'created_by' => $modx->user->id
);
$Muzei = $modx->getObject('VogMuzei', $where);
if (!$Muzei) {
$Muzei = $modx->newObject('VogMuzei', array('created_by' => $modx->user->id));
$Muzei->save();
} else {
$modx->setPlaceholders($Muzei->toArray(), $placeholderPrefix);
}
return true;
Petro, да, спасибо за подсказку. Дело в том, что в будущем у пользователя будет несколько записей. Но этот вопрос пока не стоит.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.