Помогите с логикой :( 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. Но кажется, что решение есть проще… Спасибо всем!
morzzrom
07 апреля 2016, 16:42
modx.pro
1 668
0

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

Илья Уткин
07 апреля 2016, 21:05
+1
Я не знаю, как выглядит у вас сниппет редактирования данных, но можно сделать как-то так:
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;
    morzzrom
    07 апреля 2016, 21:34
    0
    Илья, спасибо за ответ. Я поняла логику, что если какой-то пользователь, то вызываем процесс создания записи, а иначе обновляем.
    Но мне кажется, что задачу я плохо сформулировала. Как раз редактирование в форме у меня работает хорошо. Суть в том, что если у меня нет записи в базе данных у какого-то пользователя, то pdopage у которого вызов в чанке формы заполнения-редактирования не срабатывает, то есть не выводит просто форму. С редактированием то все хорошо, вопрос именно в первом наполнении. Я сейчас пробую разобраться с фильтрами ввода-вывода. Думаю, что например условие — если то pdopage иначе просто вывод пустой формы для заполнения. Даже не знаю в верном ли направлении думаю. :(
    Лев Вербицкий
    07 апреля 2016, 21:26
    +1
    pdoPage нужен для постраничности… А вы его для одной формы используете, не надо так)) Возьмите pdoResource тогда уж)
      Petro
      08 апреля 2016, 08:15
      +1
      А зачем вообще использовать pdoPage, если можно в FormIt использовать &preHooks=`getClass` и заполнять так $hook->setValue('email', $email); или через $modx->setPlaceholders ($modx->setPlaceholder)
        morzzrom
        08 апреля 2016, 13:17
        0
        Чувствую, что хожу вокруг и около, не могу сообразить :( Илья Уткин прав и Petro тоже. Лев Вербицкий — да, спасибо, я только учусь. Помогите, пожалуйста, я уже в отчаянии!
        Смотрите вот у меня как.
        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 пользователя? Не знаю:( Суть проблемы в том, что пользователь входит в свой кабинет и может открыть форму для добавления данных. НО если у него уже есть данные, то они должны отображаться в форме. А если нет данных, то он может их ввести. Я так понимаю, что нам надо проверить есть ли у пользователя данные в базе и если нет, то просто показать пустую форму, иначе вывести их. Что мне делать? :(
          Petro
          08 апреля 2016, 15:12
          +1
          О работе с объектами MODX можно почитать здесь. Здесь и о пользователях и о ресурсах…
          Илья Уткин
          08 апреля 2016, 14:37
          +1
          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());
          }
            morzzrom
            08 апреля 2016, 20:09
            0
            Всем привет снова!
            Сначала, скажу спасибо большое всем, особенно Илье Уткину. Не ожидала такой поддержки. Все таки, паника, дело плохое.
            Не уверена, что решение кошерное, но работает. Быть может кто-то еще советы даст.
            Проблема заключалась в том, что у меня в меню не было нормальной ссылки в которой бы передавались параметры полученного объекта.
            Вопрос решила так: написала свой небольшой сниппет, который передает параметры зарегистрированного пользователя в ссылку и она ведет на форму, где заполняются плейсхолдеры, по приведенному выше мною коду. Если у пользователя нет данных, то ссылка, конечно, пустая.
            Код вызова ссылки, ведущей на форму, со сниппетом
            <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;
            Может кому из таких же новичков, как я, пригодится. Решение наивное может быть… Но вроде работает. Надо курить мануалы и долго думать :)
              Petro
              09 апреля 2016, 21:55
              +1
              Если я правильно понял, то каждый пользователь имеет только одну запись в таблице. Если это так, то тогда можно обойтись и без 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;
                morzzrom
                12 апреля 2016, 17:51
                0
                Petro, да, спасибо за подсказку. Дело в том, что в будущем у пользователя будет несколько записей. Но этот вопрос пока не стоит.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              10