Наверх

Добавление, редактирование и удаление кастомных объектов

В прошлой части мы научились добавлять в MODX новый тип объектов. А сегодня мы научимся с ними работать — выведем список объектов, дадим пользователю возможность добавлять новые объекты, редактировать и удалять уже добавленные.

Для начала нужно продумать модель ваших объектов — какие поля вам понадобятся. Я возьму для примера формирование экзаменационных листов на пересдачу в вузе.



Необходимые мне поля:
  • ФИО студента
  • Группа
  • Курс
  • Предмет
  • Преподаватель
  • Дата выдачи
  • Оценка
  • Кто оформил (пользователь)

В соответствие с этой моделью создаем таблицу в базе и генерируем модель в MODX по инструкции из предыдущего урока. Я не особо уверен, что мне хватит полей и что я не захочу потом добавить еще что-то, так что я добавлю 2-3 дополнительных поля, чтобы использовать их в таком случае.

Моя таблица modx_exam_sheet будет выглядеть вот так:
DROP TABLE IF EXISTS `modx_exam_sheet`;
CREATE TABLE IF NOT EXISTS `modx_exam_sheet` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `student` varchar(255) DEFAULT NULL,
  `group` varchar(255) DEFAULT NULL,
  `course` int(1) unsigned DEFAULT NULL,
  `subject` varchar(255) DEFAULT NULL,
  `examiner` varchar(255) DEFAULT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `score` int(1) unsigned DEFAULT NULL,
  `created_by` int(10) unsigned DEFAULT NULL,
  `add1` varchar(255) DEFAULT NULL,
  `add2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `date` (`date`,`created_by`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Соответственно, сгенерированный CMPGenerator'ом пакет называется exam, а новый объект получил класс ExamSheet.

Пробуем выполнить в консоли следующий код:
$sheet = $modx->newObject('ExamSheet');
$sheet->save();

После этого проверяем, появилась ли в базе данных новая запись. Если да, значит, все ОК и можно переходить к следующему этапу.

Сразу установим FormIt, Jevix, pdoTools и, если верстка не готова, то и Theme.Bootstrap.

Вывод списка объектов


Создаем сниппет getSheets, который будет выводить общий список (будем использовать pdoTools для вывода):
$path = MODX_CORE_PATH . 'components/pdotools/model/pdotools/';
$pdoFetch = $modx->getService('pdofetch','pdoFetch', $path, $scriptProperties);
$pdoFetch->setConfig($scriptProperties);
return $pdoFetch->run();
И вызываем его на странице:
[[!pdoPage?
    &class=`ExamSheet`
    &tpl=`tpl.examSheet`
    &element=`getSheets`
]]
[[!+page.nav]]
В чанке tpl.examSheet пока напишем просто
[[+id]]. [[+student]]
Если вы вручную добавите в таблицу строк, то увидите их на странице. Причем, уже с пагинацией.

Добавление объектов


Переходим к добавлению объектов пользователями. Заходим в папку /core/components/exam/processors/ и создаем в ней папку sheet, а в ней уже файл create.class.php:
<?php
class ExamSheetCreateProcessor extends modObjectCreateProcessor {

    public $classKey = 'ExamSheet';
    public $objectType = 'object';
    
    public function beforeSet() {
        if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
        $this->setProperty('created_by', $this->modx->user->id);
        return true;
    }

}

return 'ExamSheetCreateProcessor';
и сниппет examSheet:
if (!$_POST['sheet']) {
    $processor = 'sheet/create';
} else {
    $_POST['id'] = $_POST['sheet'];
    $modx->setPlaceholder('id', $_POST['id']);
    $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;

Теперь делаем страничку добавления/редактирования объекта. Для проверки полей будем использовать FormIt (сверстано для Bootstrap):

[[!getSheetData]]
[[!FormIt?  
  &hooks=`examSheet,redirect`
  &redirectTo=`1`
  &placeholderPrefix=``
  &validate=`student:required,
       group:required,
       course:required,
       subject:required,
       examiner:required,
       score:required`
]]
<div class="row">
<div class="col-lg-6" style="margin-left: auto; margin-right: auto; float: none;">
[[!+error.process_error:notempty=`<div class="alert alert-dismissable alert-danger">
  <button type="button" class="close" data-dismiss="alert">×</button>
  <strong>Ошибка!</strong> [[!+error.process_error]]
</div>`]]
<div class="well">
  <form class="bs-example form-horizontal" action="[[~[[*id]]]]" method="post">
    <input type="hidden" value="[[!+id]]" name="sheet">
    <fieldset>
      <legend>[[*pagetitle]]</legend>
      <div class="form-group [[!+error.student:notempty=`has-error`]]">
        <label for="student" class="col-lg-4 control-label">Студент</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+student]]" class="form-control"
          id="student" placeholder="Иванов Александр Юрьевич" name="student">
          <span class="help-block">[[!+error.student]]</span>
        </div>
      </div>
      <div class="form-group [[!+error.group:notempty=`has-error`]]">
        <label for="group" class="col-lg-4 control-label">Группа</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+group]]" class="form-control"
          id="group" placeholder="МО-54" name="group">
          <span class="help-block">[[!+error.group]]</span>
        </div>
      </div>
      <div class="form-group [[!+error.course:notempty=`has-error`]]">
        <label for="course" class="col-lg-4 control-label">Курс</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+course]]" class="form-control"
          id="course" placeholder="5" name="course">
          <span class="help-block">[[!+error.course]]</span>
        </div>
      </div>
      <div class="form-group [[!+error.subject:notempty=`has-error`]]">
        <label for="subject" class="col-lg-4 control-label">Предмет</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+subject]]" class="form-control"
          id="subject" placeholder="Статистика" name="subject">
          <span class="help-block">[[!+error.subject]]</span>
        </div>
      </div>
      <div class="form-group [[!+error.examiner:notempty=`has-error`]]">
        <label for="examiner" class="col-lg-4 control-label">Преподаватель</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+examiner]]" class="form-control"
          id="examiner" placeholder="Ефремов Виталий Борисович" name="examiner">
          <span class="help-block">[[!+error.examiner]]</span>
        </div>
      </div>
      <div class="form-group [[!+error.score:notempty=`has-error`]]">
        <label for="score" class="col-lg-4 control-label">Оценка</label>
        <div class="col-lg-8">
          <input type="text" value="[[!+score]]" class="form-control"
          id="score" placeholder="4" name="score">
          <span class="help-block">[[!+error.score]]</span>
        </div>
      </div>
      <div class="form-group">
        <div class="col-lg-8 col-lg-offset-4">
          <button type="submit" class="btn btn-primary">Сохранить</button>
          <button type="submit" class="btn btn-danger btn-xs"
            name="remove" value="remove"
            onclick="return confirm('Удалить экзаменационный лист?')">Удалить</button>
        </div>
      </div>
    </fieldset>
  </form>
</div>
</div>
</div>
Вот и все! Вы можете добавлять объекты через фронтенд. Можно создать несколько пользователей — в базе всегда будет сохраняться, кто добавил тот или иной объект.

Редактирование объектов


Внимательные заметили в коде вызов сниппета getSheetData. Это уже для редактирования объекта. Его код:
if ($_GET['sheet'] && $sheet = $modx->getObject('ExamSheet', $_GET['sheet'])) {
    $modx->setPlaceholders($sheet->toArray());
}
Этот сниппет получает данные объекта и набивает их в плейсхолдеры. А эти плейсхолдеры у нас стоят в полях формы. Соответственно, если вы припишете к адресу страницы добавления get-параметр sheet с id-шником нужного объекта, вы получите форму, заполненную данными объекта. А в сниппете examSheet у нас уже заложено разветвление — если указан id объекта, используется процессор update. Осталось его создать — создаем файл /core/components/exam/processors/sheet/update.class.php:
<?php
class ExamSheetUpdateProcessor extends modObjectUpdateProcessor {

    public $classKey = 'ExamSheet';
    public $objectType = 'object';
    
    public function beforeSet() {
        if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
        if ($this->object->get('created_by') != $this->modx->user->id)
            return 'Вы не можете редактировать чужие записи';
        return true;
    }

}

return 'ExamSheetUpdateProcessor';
Процессор проверяет не только авторизацию пользователя, но и принадлежность объекта к текущему пользователю.

Все эти проверки добавлены для примера, чтобы вы понимали, где что нужно писать. Вы можете убрать все проверки, тогда даже анонимный пользователь сможет делать с вашими объектами что угодно.

Поправим чанк tpl.examSheet:
<tr>
    <td>[[+id]]</td>
    <td><a href="[[~4? &sheet=`[[+id]]`]]">[[+student]]</a></td>
    <td>[[+group]]</td>
    <td>[[+course]]</td>
    <td>[[+subject]]</td>
    <td>[[+examiner]]</td>
    <td>[[+date:strtotime:date=`%d.%m.%Y г.`]]</td>
    <td>[[+score]]</td>
</tr>
и вызов на странице списка:
<a href="[[~4]]" class="btn btn-primary">
  <span class="glyphicon glyphicon-plus"></span>
  Выдать экзаминационный лист
</a>
<table class="table">
<thead>
<tr>
    <th>№</th>
    <th>Студент</th>
    <th>Группа</th>
    <th>Курс</th>
    <th>Предмет</th>
    <th>Преподаватель</th>
    <th>Дата выдачи</th>
    <th>Оценка</th>
</tr>
</thead>
<tbody>
[[!pdoPage?
    &class=`ExamSheet`
    &tpl=`tpl.examSheet`
    &element=`getSheets`
    &limit=`50`
]]
</tbody>
</table>
[[!+page.nav]]
Можете потестировать создание и редактирование (по нажатию на ФИО студента).

Удаление объектов


Для добавления функции удаления объектов, правим сниппет ExamSheet:
if (!$_POST['sheet']) {
    $processor = 'sheet/create';
} else {
    $_POST['id'] = $_POST['sheet'];
    $modx->setPlaceholder('id', $_POST['id']);
    if ($_POST['remove']) {
        $processor = 'sheet/remove';
    } 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;
и создаем файл-процессор /core/components/exam/processors/sheet/remove.class.php:
<?php
class ExamSheetRemoveProcessor extends modObjectRemoveProcessor {

    public $classKey = 'ExamSheet';
    public $objectType = 'object';
    
    public function beforeRemove() {
        if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
        if ($this->object->get('created_by') != $this->modx->user->id)
            return 'Вы не можете удалять чужие записи';
        return true;
    }

}

return 'ExamSheetRemoveProcessor';

В следующий раз планирую сделать фильтрацию, сортировку, поиск записей. А на сегодня материала и так много.


155 комментариев

  1. Oleg Gabdulkhakov 17 февраля 2014, 08:22(Комментарий был изменён) # +1
    спасибо. очень полезный урок, буду осваивать. а то до сих пор свои таблицы наполняю через phpmyadmin-))

    1. Аноним 26 февраля 2014, 01:38(Комментарий был изменён) # +1
      Спасибо за урок! А как выводить записи только текущего пользователя как тут ilyaut.bget.ru/mine/?
      Заранее спасибо за ответ!
      1. Илья Уткин 26 февраля 2014, 10:17(Комментарий был изменён) # +2
        [[!pdoPage?
            &class=`ExamSheet`
            &tpl=`tpl.examSheet`
            &element=`getSheets`
            &where=`{"created_by":[[!+modx.user.id]]}`
        ]]
        [[!+page.nav]]
        Доступны все стандартные выборки))
        1. Jevgeni Kostenko 18 сентября 2015, 10:09 # 0
          Как закрыть доступ на чтение не своих полей таблицы?
          Прописан код выше(
          [[!pdoPage?
          &class=`ExamSheet`
          &tpl=`tpl.examSheet`
          &element=`getSheets`
          &where=`{«created_by»:[[!+modx.user.id]]}`
          ]]
          [[!+page.nav]]
          ),
          но в данном примере можно прочитать не свои поля при редактировании так:
          /index.php?id=4&sheet=(вот тут подставить не свой ID)
          1. Илья Уткин 18 сентября 2015, 10:12 # +1
            Переделать сниппет getSheetData, примерно так:
            if ($_GET['sheet'] && $sheet = $modx->getObject('ExamSheet', $_GET['sheet'])) {
                if ($sheet->get('created_by') == $modx->user->id) {
                    $modx->setPlaceholders($sheet->toArray());
                }
            }
          2. Андрей 23 февраля 2016, 07:43 # 0
            а как можно в
            &where=`{"created_by":[[!+modx.user.id]]}`
            прописать свой параметр, переданный через ссылку, скажем для фильтра по преподавателям
            &where=`{"examiner":[[examiner_id]]}`
            1. Илья Уткин 24 февраля 2016, 07:48 # 0
              Конечно, только так и можно.
              1. Андрей 25 февраля 2016, 04:55 # 0
                Я не сделал акцент в вопросе, голова была забита))
                А как можно этот параметр из ссылки забрать?
                1. Илья Уткин 25 февраля 2016, 10:04 # 0
                  // /path/to/script?examiner=150
                  &where=`{"examiner":[[!examiner_id]]}`

                  examiner_id
                  <?php
                  return $_GET['examiner'] ? $_GET['examiner'] : $modx->user->id;
            2. Мишка Вседовольный 21 июля 2016, 12:16(Комментарий был изменён) # 0
              а как сделать &where=``, если у меня несколько вариантов для 1 поля значений? например
              &where=`{"created_by":"Коля"},{"created_by":"Вася"}`
              1. Илья Уткин 21 июля 2016, 12:21 # 0
                &where=`{"created_by:IN":[15,63,122]}`
                &where=`{"name:IN":["Коля","Вася"]}`
                1. Мишка Вседовольный 21 июля 2016, 12:36 # 0
                  не выходит. Ничего не отображает. Индексы имеют какое-то значение?
                  1. Мишка Вседовольный 21 июля 2016, 14:06 # 0
                    переустановил pdoTools и все отлично… Спасибо, Илья!
              2. Мишка Вседовольный 05 сентября 2016, 10:23 # 0
                У меня проблема с пагинацией:
                Не происходит редирект на следующую страницы ( а возвращает туже страницу, с которой совершался переход по меню пагинации).

                Причем ссылка в строке браузера меняется с */index.php?id=3&page=3 на */index.php?id=3&id=3.

                Возможно не установлен какой-то из плагинов? по данной проблеме не нашел совпадений в поиске.
            3. Денис 15 июля 2014, 10:35 # 0
              а например мне нужно не показывать строку, как сделать условие? В базе есть в строке запись published = 1 — показывать published = 0 -не показывать
              1. Илья Уткин 15 июля 2014, 14:08 # 0
                [[!pdoPage?
                    &class=`ExamSheet`
                    &tpl=`tpl.examSheet`
                    &element=`getSheets`
                    &where=`{"created_by":[[!+modx.user.id]],"published":1}`
                ]]
                [[!+page.nav]]
                1. Саша 13 сентября 2014, 16:09 # 0
                  Илья, привет.

                  По этому сниппету
                  Подскажи, пожалуйста, можно ли получить кол-во строк в которых «published»:1?
                  1. Илья Уткин 15 сентября 2014, 10:09 # +2
                    Привет. На сколько я знаю, pdoPage устанавливает плейсхолдер total:
                    [[!pdoPage?
                        &class=`ExamSheet`
                        &tpl=`tpl.examSheet`
                        &element=`getSheets`
                        &where=`{"created_by":[[!+modx.user.id]],"published":1}`
                    ]]
                    [[!+page.nav]]
                    [[+total]]
              2. Саша 10 сентября 2014, 13:32 # 0
                Илья привет!
                Подскажи плиз как можно сделать вот такую схему:

                Заходим на страницу где таблица, не нажимаем редактировать.

                Напротив каждой строки есть чекбокс.
                Поставили галочку.
                Нажали сохранить.
                И изменения пришли в базу.
                Если есть галочка, то published = 1
                Если нет то published = 0

                Спасибо за урок!
                1. Илья Уткин 10 сентября 2014, 13:34 # 0
                  Да, можно. Это уже более продвинутый уровень — нужно уметь объединить HTML, PHP, JS. Так просто на пальцах не объяснить.
                2. Саша 10 сентября 2014, 14:30 # 0
                  Спасибо. будем изучать и практиковаться.
                  1. Александр Наумов 21 октября 2014, 16:59 # 0
                    Илья, спасибо большое!!!
                    Отличные статьи пишешь, просто и доступно!
                    1. Артём 30 декабря 2014, 04:50 # 0
                      Илья, здравствуйте!
                      Совсем недавно читаю Вас, но все написано предельно доходчиво. Вопрос такой: Вы сказали добавите 2-3 дополнительных поля на всякий случай. А если и этих трех полей не хватит, то будет ли потом проблематично добавить еще поля? Вы их 2-3 добавили из за удобства или же из-за технической сложности добавления новых полей в будущем? Спасибо!
                      1. Илья Уткин 30 декабря 2014, 08:17 # 0
                        Нет, не сложно. Надо добавить поле в базу и опять сгенерировать пакет.
                        1. Коля Загумённов 07 января 2015, 10:45 # 0
                          Здравствуйте, Илья. Спасибо за статьи, очень полезны.
                          То есть нужно удалить пакет в CMP generator и удалить папки компонента в core и assets, а потом заново его создать?
                          1. Илья Уткин 12 января 2015, 07:37 # 0
                            Нет, не надо ничего удалять — просто заново генерируй модель.
                      2. Фдуч 22 февраля 2015, 21:52 # 0
                        Таблицу в базе создал
                        DROP TABLE IF EXISTS `modx_statistic_sheet`;
                        CREATE TABLE IF NOT EXISTS `modx_statistic_sheet` (
                        	`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
                        	`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                        	`created_by` int(10) unsigned DEFAULT NULL,
                        	`event` varchar(255) DEFAULT NULL,
                        	`forecast` varchar(255) DEFAULT NULL,
                        	`factor` float(5,2) unsigned DEFAULT NULL,
                        	`resume` tinyint(1) unsigned DEFAULT NULL,
                        	PRIMARY KEY (`id`),
                        	KEY `date` (`date`,`created_by`)
                        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
                        В CMPGenerator пакет сгенерировал, он появился в components.
                        В консоли
                        $modx->addExtensionPackage('statistic', '[[++core_path]]components/statistic/model/');
                        сделал, соответствующий ключик со значением в настройках появился.
                        А когда в консоли пытаюсь
                        <?php
                        $item = $modx->newObject('StatisticSheet');
                        $item->save();
                        сделать — появляется гифка ожидания и ничего не происходит :(
                        В журнале — чисто. Где мог ошибиться?
                        1. Фдуч 23 февраля 2015, 15:07 # 0
                          Оказывается не надо было указывать имя базы данных, при создании пакета в CMPGenerator. Даже в документации по нему написано «Leave Database Name empty unless you are using a foreign database». Кажется, Илья, надо это как то отметить в предыдущем уроке, там это не очевидно. Может, кто то еще не догадается.
                          1. Илья Уткин 24 февраля 2015, 08:04 # 0
                            Хм… странно, я указывал имя… поправил статью.
                        2. Сергей 11 мая 2015, 03:47 # 0
                          Здравствуйте Илья. У меня возник вопрос, точнее я не могу понять что не так делаю. Создал пакет, записи все отображает на кастомной странице, создание записи проходит в штатном режиме!, но вот редактирование и удаление НЕ работает, точнее сказать плейсхолдеры заполняет только при нажатии удалить, происходит дублирование записи, тоже самое и с кнопкой сохранить,

                          привожу пример кода:
                          
                          <?php
                          if (!$_POST['jobsstatus']) {
                              $processor = 'jobsstatus/create';
                          } else {
                              $_POST['id'] = $_POST['jobsstatus'];
                              $modx->setPlaceholder('id', $_POST['id']);
                              if ($_POST['remove']) {
                                  $processor = 'jobsstatus/remove';
                              } else {
                                  $processor = 'jobsstatus/update';
                              }
                          }
                          $processorProps = array('processors_path' => $modx->getOption('core_path')
                                          . 'components/Jobs/processors/');
                          $response = $modx->runProcessor($processor, $_POST, $processorProps);
                          if ($response->isError()) {
                              $hook->addError('process_error', $response->getMessage());
                              return false;
                          }
                          return true;
                          
                          
                          создал классы апдейта и удаления, что я делаю не так?
                          1. Илья Уткин 11 мая 2015, 07:40 # 0
                            Видимо, не хватает сниппета getSheetData
                          2. Сергей 12 мая 2015, 00:33 # 0
                            сниппет все подгружает вот код («get2editJobsStatus»)Э
                            <?php
                            if ($_GET['jobsstatus'] && $jobsstatus = $modx->getObject('JobsStatus', $_GET['jobsstatus'])) {
                                $modx->setPlaceholders($jobsstatus->toArray());
                            }
                            
                            
                            1. Сергей Леоненко 12 мая 2015, 00:41 # 0
                              все сниппеты были скопированны с урока, работаю сейчас ток с одной таблицей, класс Jobs Status. Создал папку процессоров в ней папку jobssatatus/ в ней три класса на создание, апдэйт и удалить, удалил в них проверку на авторизацию и принадлежность, ( создаю для фронт-менеджера, авторизация через стандарт, почему происходит дублирование записи а не удаление не могу отдуплить, УРЛ при клике на обьект для обновления такой: /index.php?id=28&jobsstatus=1
                              1. Сергей Леоненко 12 мая 2015, 00:42 # 0
                                пакет генерил через мигх
                                1. Сергей Леоненко 12 мая 2015, 00:45 # 0
                                  как я могбы вам скинуть скрины? или по личке более конкретно, интересный проект возможно поддержалибы :)
                                  1. Сергей Леоненко 12 мая 2015, 00:47 # 0
                                    прост проект на локалке
                                    1. Сергей Леоненко 12 мая 2015, 01:03 # 0
                                      Начал обратно тыкать, вродеб работает как положенно, вполне подозреваю что кеш не чистил, бывает, будем работать дальше. В любом случае Ваши занятия или материалы, очень полезны. Спасибо Вам за них, хотелось бы побольше. Я сам не очень силен в ПхП, но как считаю анализировать код получается, Проект который сейчас делаю для компании в которой и работаю (по покраске) сам я тож тем же занимаюсь, совмещаю :) Проект: администрирование проектов и предложений с регистрацией часов которые рабочие тратят на каждый проект, а также всех остальных расходов, с последующим выводом необходимой информации для всех звеньев в руководстве, учитывая политику доступа к той или иной информации. Проект как мне кажется интересный и вполне может перейти в рабочий пакет для модекса, для разных сфер. Спасибо
                                      1. Сергей Леоненко 12 мая 2015, 01:27 # 0
                                        Такой теперь вопрос, как вывести данные с двух таблиц в одну,
                                        Пример: есть таблица user, и экзаменационный лист (где только указан id юзера)

                                        как подставить вместо значения id его имя?
                                        1. Илья Уткин 12 мая 2015, 07:17 # 0
                                          Ну тут уже пора разбираться с JOIN: Большой рассказ про pdoTools, часть вторая. Начинайте знакомиться и с уроками Василия теперь)
                                          1. Виталий Зиборов 27 августа 2015, 17:05(Комментарий был изменён) # 0
                                            Зря написал вопрос, сразу и разобрался)))
                                            1. Виталий Зиборов 27 августа 2015, 17:30 # 0
                                              Могу только от себя подтвердить, что Pdotools — очень мощный инструмент, надо только немножко в него вникнуть.)))
                                        2. Сергей Леоненко 12 мая 2015, 23:17 # 0
                                          Спасибо. :)
                                          1. Сергей Леоненко 25 мая 2015, 17:07 # 0
                                            Илья такой еще вопрос, pdoPage не выводит пагинацию. В связи с чем может быть ошибка?

                                            [[!pdoPage?
                                            &class=`ExamSheet`
                                            &tpl=`tpl.examSheet`
                                            &element=`getSheets`
                                            ]]
                                            [[!+page.nav]]
                                            1. Илья Уткин 26 мая 2015, 12:46 # 0
                                              Если все сделали правильно, должно все работать. Попробуйте вместо pdoPage getPage
                                            2. Сергей Леоненко 26 мая 2015, 23:39 # 0
                                              Попробовал, пагинация с getPage работает. В чем прикол? что не так?
                                              1. Илья Уткин 27 мая 2015, 07:37 # 0
                                                Добавьте в вызов pdoPage такой параметр:
                                                &pageNavVar=`page.nav`
                                              2. Сергей Леоненко 28 мая 2015, 02:54 # 0
                                                Точнее не работает а выводится, а вот при попытке перейти на &id=26&page=2, почему-то урл меняется на &id=26&id=26. И соответсвенно никуда не переходит. Все это происходит во время работы сниппета. В чем по Вашему может быть причина данного. Я подозреваю что потому и pdoPage тоже не работает корректно.
                                                1. Илья Уткин 28 мая 2015, 11:53 # 0
                                                  Не знаю… что-то странное происходит. Я с таким не сталкивался
                                                2. Сергей Леоненко 28 мая 2015, 02:54 # 0
                                                  Добавлял параметр все тоже.
                                                  1. Сергей Леоненко 28 мая 2015, 02:54 # 0
                                                    в логах ничего
                                                    1. Андрей Копп 05 августа 2015, 21:22 # 0
                                                      Подскажите что за ошибка может быть в консоли при обновлении страницы со сниппетом:

                                                      [2015-08-06 00:14:09] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'name' in 'order clause'

                                                      У меня нет полей в базе с названием name, соответственно ничего из базы не выводиться через pdoPage.
                                                      1. Илья Уткин 06 августа 2015, 07:43 # 0
                                                        Попробуйте добавить
                                                        &sortby=`id`
                                                      2. Дмитрий 04 сентября 2015, 17:27 # 0
                                                        А если у меня 2 таблицы, допустим таблица «Объявления» и таблица «ДопПоля»… никак не понимаю как их пристыковать в pdoPage. Понимаю что нужно смотреть в сторону LeftJoin. может подскажете примером?

                                                        Пытаюсь поступить так:
                                                                    [[!pdoPage?
                                                                        &class=`Announcements`
                                                                        &tpl=`tpl.announcements.auto`
                                                                        &element=`getAuto`
                                                        	        &leftJoin => `array(
                                                                    		'AutoFields' => array(
                                                                    			'class' => 'AutoFields',
                                                                    			'on' => 'Announcements.id = AutoFields.announcement_id',
                                                                    		)`
                                                                    ]]
                                                        1. Илья Уткин 04 сентября 2015, 17:45 # 0
                                                          Массив должен быть в виде JSON.

                                                          [[!pdoPage?
                                                            &class=`Announcements`
                                                            &tpl=`tpl.announcements.auto`
                                                            &element=`getAuto`
                                                            &leftJoin => `{"AutoFields":{"class":"AutoFields",
                                                                    "on":"Announcements.id = AutoFields.announcement_id"}}`
                                                          ]]
                                                          Как-то так
                                                          1. Дмитрий 05 сентября 2015, 03:22(Комментарий был изменён) # 0
                                                            К сожалению не срабатывает, классы и поля показываются так же. Такое чувство что эта дирректива просто игнорируется, хоть что туда пишу, она все равно выводит просто все поля. Даже если указать ошибочно. А насколько данный способ представления данных будет медленнее следущего:
                                                            $q = $modx->newQuery('Announcements');
                                                            //$q->where(array('id' => '1'));
                                                            $q->leftJoin('AutoFields', 'auto', 'auto.announcement_id =Announcements.id');
                                                            $q->select(array('Announcements.*, auto.*'));
                                                            $q->limit(10); 
                                                            $q->prepare();
                                                            $q->stmt->execute();
                                                            $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
                                                            echo "<pre>";
                                                                print_r($res);
                                                            echo "</pre>";
                                                            Ну в дальнейшем с обходом цикла и передачей в чанк массива строки. Данный способ же тоже можно как то разбивать по страницам насколько я понимаю. Есть возможность данный снипет каким то образом вызывать как &element в сниппете pdoPage?
                                                            1. Илья Уткин 07 сентября 2015, 07:24 # 0
                                                              Возможно, такой сниппет отработает даже быстрее.

                                                              А в pdoPage можно любой сниппет передавать. Главное, чтобы он устанавливал плейсхолдер total и понимал limit/offset
                                                        2. Виталий 24 сентября 2015, 12:26 # 0
                                                          Здравствуйте, Илья.
                                                          Сделал у себя форму для сбора анкетных данных по примеру из этого урока, добавил отправку по е-майл. Всё работало нормально, но через некоторое время форма стала делать submit по нажатию enter в любом поле. За последнее время я делал несколько пробных установок различных дополнений для MODX, возможно причина в этом, поскольку теперь любая форма c Formit делает submit по нажатию enter в любом поле.
                                                          Не хотелось бы переустанавливать сайт с нуля, может подскажете идею, как можно отловить причину?
                                                          1. Илья Уткин 24 сентября 2015, 12:31 # 0
                                                            Нет, это стандартное поведение. Enter в текстовом поле отправляет форму и исправить это можно только используя Javascript, например, сделать форму скрытую, а поля фейковыми.

                                                            Enter переводит строку только в textarea.

                                                            Вот самая обычная форма — без использования любых сниппетов. И она тоже отправляется по нажатию Enter внутри поля: http://jsfiddle.net/002xpxz7/
                                                            1. Виталий 24 сентября 2015, 12:54 # 0
                                                              Спасибо за оперативный ответ. Странно, почему-же в начале у меня форма честно ждала нажатия Submit`a )). Получается, как раз раньше-то глюк какой-то и сидел… да теперь потерялся).
                                                              Т.е. по любому Enter`y срабатывает валидация и отправка, если заполнены все обязательные поля. Если сделать все поля обязательными, то форма никуда не денется, пока не будет заполнена полностью.
                                                              Это в принципе, нормально, но у меня не получилось добиться нормальной отправки формы по e-mail без добавления «fi.» к именам полей в плейсхолдерах, и теперь поля с «fi.» стали очищаться при обновлении формы после Enter. Если «fi.» не добавлять, то поля не очищаются. Это специфика Formit`a такая? Как можно побороть эту ситуацию? Пусть форма перегружается, но чтобы данные не чистились и mail отправлялся нормально.
                                                              1. Илья Уткин 24 сентября 2015, 13:00 # 0
                                                                Когда форма отправлена успешно, она очищается. Смысл сохранения значения в полях как раз в том, чтобы они сохранялись только при ошибке.

                                                                Если человек правильно ввел все поля, но ошибся в e-mail или не ввел какое-то обязательное поле, страница обновится и будет выведена ошибка. Если поля не сохранить, пользователь очень расстроится, что ему придется вводить всё заново.

                                                                Но если форма успешно отправлена, поля очищаются, и пользователь не испытывает от этого дискомфорта. Кроме того, он может захотеть отправить форму еще раз, но с другими данными — тогда ему не придется стирать все данные во всех полях.
                                                                1. Виталий 24 сентября 2015, 13:59(Комментарий был изменён) # 0
                                                                  Если человек правильно ввел все поля, но ошибся в e-mail или не ввел какое-то обязательное поле, страница обновится и будет выведена ошибка. Если поля не сохранить, пользователь очень расстроится, что ему придется вводить всё заново.
                                                                  Вот как раз они и не сохраняются…
                                                                  У меня получилось, что при вводе любого текстового поля страница обновляется и введенные значения теряются, если сделать форму по Вашему образцу и добавить «fi.» к именам полей в плейсхолдерах, как обычно делается в формах для Formit. Т.е. человек в принципе не может ввести форму полностью, потому что при вводе каждого текстового поля оно очищается). Если не добавлять «fi.» к именам полей в плейсхолдерах, то поля не чистятся, но не отправляется нормально копия на e-mail.
                                                                  В этом и суть проблемы, как добиться, чтобы при добавлении «fi.» к именам полей в плейсхолдерах поля не очищались приобновлении формы.
                                                                  Более конкретный вопрос- почему Вы в своем примере не используете «fi.» в именах полей в плейсхолдерах?
                                                                  1. Илья Уткин 24 сентября 2015, 14:14 # 0
                                                                    Уберите в вызове параметр &placeholderPrefix=``
                                                                    1. Виталий 24 сентября 2015, 14:18 # 0
                                                                      Спасибо. Оно самое. Как обычно, самые страшные глюки из-за невнимательности к параметрам)))
                                                          2. Антон 25 сентября 2015, 08:27 # 0
                                                            При открытии записи для редактирования URL имеет вид: site.com?id=1&cheet=1
                                                            После отправки формы GET параметр cheet пропадает и URL имеет вид: site.com?id=1.
                                                            Как сохранить GET параметр после отправки формы?
                                                            1. Илья Уткин 25 сентября 2015, 08:30 # 0
                                                              Убрать параметр &redirectTo=`1`, а параметр hooks изменить так: &hooks=`examSheet`
                                                              1. Антон 25 сентября 2015, 08:38 # 0
                                                                Не уместно в данной ситуации. Редирект срабатывает только в том случае, если сниппет examSheet вернет true, а он возвращает false и снова загружается страница с заполненной формой (и с текстом ошибки, например), но GET параметра уже нет.
                                                                К слову, попробовал так сделать, не сработало, чего и следовало ожидать.
                                                                1. Антон 25 сентября 2015, 08:44 # 0
                                                                  Разобрался. Атрибут action у формы пустым оставить надо. Изначально так и сделал, но это вызывало другую ошибку, которую только что исправил). Подумал, может другой способ решения есть.
                                                                  В общем, спасибо, Илья, за отзывчивость. Не ожидал столь быстрого ответа)
                                                                  1. Настя 25 октября 2015, 15:31 # 0
                                                                    Можно поинтересоваться, как вы устранили данную проблему?
                                                                    1. Антон 25 октября 2015, 15:54 # 0
                                                                      Ох… я уж и не вспомню. У меня в сниппете получения данных (в данной статье он getSheetData) выполняется редирект на страницу со списком материалов, если выполняется запрос для редактирования материала, которого не существует. По какой-то причине он и срабатывал при отправке формы после редактирования
                                                              2. Зиборов Виталий 06 октября 2015, 14:16 # 0
                                                                Илья, добрый день.
                                                                Возникла потребность добавить в форму идентификатор сессии.
                                                                Написал prehook для FormIt:
                                                                <?php
                                                                $hook->setValue('SessId',session_id());
                                                                return true;

                                                                Добавил в форму input с именем SessId, форма срабатывает, но SessId в базу не пишется.
                                                                Можешь посоветовать, как добиться, чтобы это поле дописывалось. Наверное, лучше переделать сниппет с вызовом процессора (ExamSheet). У меня форма только создает анкеты, других процессоров нет.
                                                                1. Зиборов Виталий 06 октября 2015, 15:30 # 0
                                                                  Спасибо, уже сам разобрался.
                                                                  А проблема просто решалась — забыл обновить модель в CMP Generator`e.
                                                                2. Настя 25 октября 2015, 12:25 # 0
                                                                  У меня вопрос: не получается сделать добавление, редактирование и удаление записей.
                                                                  Таблицу с данными выводит, но если нажать по ссылке «редактирование», то выводит форму правильно, с теми же данными, что и в строке, единственное, что если отредактировать данные и нажать кнопку сохранить, то перебрасывает опять на эту же форму, только пустую.
                                                                  Классы создания, редактирования и удаления я создала:
                                                                  <?php
                                                                  class MetObespCreateProcessor extends modObjectCreateProcessor {
                                                                  
                                                                      public $classKey = 'MetObesp';
                                                                      public $objectType = 'object';
                                                                      
                                                                      public function beforeSet() {
                                                                          if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                                                                          $this->setProperty('created_by', $this->modx->user->id);
                                                                          return true;
                                                                      }
                                                                  
                                                                  }
                                                                  
                                                                  return 'MetObespCreateProcessor';
                                                                  точно также редакт. и удаление

                                                                  Сниппет MetObesp
                                                                  if (!$_POST['obesp']) {
                                                                      $processor = 'obesp/create';
                                                                  } else {
                                                                      $_POST['id'] = $_POST['obesp'];
                                                                      $modx->setPlaceholder('id', $_POST['id']);
                                                                      if ($_POST['remove']) {
                                                                          $processor = 'obesp/remove';
                                                                      } else {
                                                                          $processor = 'obesp/update';
                                                                      }
                                                                  }
                                                                  $processorProps = array('processors_path' => $modx->getOption('core_path')
                                                                                  . 'components/Uch/processors/');
                                                                  $response = $modx->runProcessor($processor, $_POST, $processorProps);
                                                                  if ($response->isError()) {
                                                                      $hook->addError('process_error', $response->getMessage());
                                                                      return false;
                                                                  }
                                                                  return true;
                                                                  И содержимое страницы редактирования:
                                                                  [[!getObespData?]]
                                                                  [[!FormIt?  
                                                                    &hooks=`MetObesp,redirect`
                                                                    &redirectTo=3`
                                                                    &validate=
                                                                        'rabota:required,
                                                                         zatr:required,
                                                                         nachalo:required,
                                                                         konec:required,
                                                                         isp:required'
                                                                  ]]
                                                                  <div class="row">
                                                                  <div class="col-lg-6" style="margin-left: auto; margin-right: auto; float: none;">
                                                                  [[!+error.process_error:notempty=`<div class="alert alert-dismissable alert-danger">
                                                                    <button type="button" class="close" data-dismiss="alert">×</button>
                                                                    <strong>Ошибка!</strong> [[!+error.process_error]]
                                                                  </div>`]]
                                                                  <div class="well">
                                                                    <form class="bs-example form-horizontal" action="[[~[[*id]]]]" method="post">
                                                                      <input type="hidden" value="[[!+id]]" name="obesp">
                                                                      <fieldset>
                                                                        <legend>[[*pagetitle]]</legend>
                                                                        <div class="form-group [[!+error.rabota:notempty=`has-error`]]">
                                                                          <label for="rabota" class="col-lg-4 control-label">Наименование работы</label>
                                                                          <div class="col-lg-8">
                                                                            <input type="text" value="[[!+rabota]]" class="form-control"
                                                                            id="rabota" placeholder="Работа" name="rabota">
                                                                            <span class="help-block">[[!+error.rabota]]</span>
                                                                          </div>
                                                                        </div>
                                                                        <div class="form-group [[!+error.zatr:notempty=`has-error`]]">
                                                                          <label for="zatr" class="col-lg-4 control-label">Затраты (часов)</label>
                                                                          <div class="col-lg-8">
                                                                            <input type="int" value="[[!+zatr]]" class="form-control"
                                                                            id="zatr" placeholder="1" name="zatr">
                                                                            <span class="help-block">[[!+error.zatr]]</span>
                                                                          </div>
                                                                        </div>
                                                                        <div class="form-group [[!+error.nachalo:notempty=`has-error`]]">
                                                                          <label for="nachalo" class="col-lg-4 control-label">Начало работы</label>
                                                                          <div class="col-lg-8">
                                                                            <input type="date" value="[[!+nachalo]]" class="form-control"
                                                                            id="nachalo" placeholder="00-00-0000" name="nachalo">
                                                                            <span class="help-block">[[!+error.nachalo]]</span>
                                                                          </div>
                                                                        </div>
                                                                        <div class="form-group [[!+error.konec:notempty=`has-error`]]">
                                                                          <label for="konec" class="col-lg-4 control-label">Окончание работы</label>
                                                                          <div class="col-lg-8">
                                                                            <input type="date" value="[[!+konec]]" class="form-control"
                                                                            id="konec" placeholder="00-00-0000" name="konec">
                                                                            <span class="help-block">[[!+error.konec]]</span>
                                                                          </div>
                                                                        </div>
                                                                        <div class="form-group [[!+error.isp:notempty=`has-error`]]">
                                                                          <label for="isp" class="col-lg-4 control-label">Отметка об исполнении</label>
                                                                          <div class="col-lg-8">
                                                                            <input type="tinyint" value="[[!+isp]]" class="form-control"
                                                                            id="isp" placeholder="-" name="isp">
                                                                            <span class="help-block">[[!+error.isp]]</span>
                                                                          </div>
                                                                        </div>
                                                                        <div class="form-group">
                                                                          <div class="col-lg-8 col-lg-offset-4">
                                                                            <button type="submit" class="btn btn-primary">Сохранить</button>
                                                                            <button type="submit" class="btn btn-danger btn-xs"
                                                                              name="remove" value="remove"
                                                                              onclick="return confirm('Удалить запись?')">Удалить</button>
                                                                          </div>
                                                                        </div>
                                                                      </fieldset>
                                                                    </form>
                                                                  </div>
                                                                  </div>
                                                                  </div>
                                                                  Не могу понять, в чем ошибка?
                                                                  1. Антон 26 октября 2015, 06:00 # 0
                                                                    У FormIt добавь параметр &placeholderPrefix=``. По умолчанию в сниппете используется префикс fi.
                                                                    1. Настя 27 октября 2015, 18:48 # 0
                                                                      Спасибо за совет, но дело видимо не в этом, не помогло решение
                                                                    2. Илья Уткин 28 октября 2015, 12:18 # 0
                                                                      Во-первых, у вас проблемки с кавычками… Надо так:
                                                                      [[!FormIt?  
                                                                        &hooks=`MetObesp,redirect`
                                                                        &redirectTo=`3`
                                                                        &validate=`rabota:required,
                                                                             zatr:required,
                                                                             nachalo:required,
                                                                             konec:required,
                                                                             isp:required`
                                                                      ]]

                                                                      Ну и ресурс с ID = 3 это что за ресурс? Может надо поставить &redirectTo=`1`?
                                                                      1. Настя 29 октября 2015, 07:36 # 0
                                                                        Спасибо, Илья, я уже разобралась, все работает как надо)
                                                                    3. Паша 30 ноября 2015, 11:00 # 0
                                                                      Здравствуйте, Илья. Скажите, чем это чревато?

                                                                      В error.log MODX'a пишет после добавления пакета в CMP
                                                                      [2015-11-30 13:40:23] (ERROR @ /assets/components/cmpgenerator/connector.php) Path specified for package partrequest is not a valid or accessible directory: /var/www/samurai/core/components/partrequest/model/
                                                                      права на папки 0755, файлы 0644

                                                                      В принципе все работает, просто немного неприятно видеть ошибки в логе…
                                                                      1. Илья Уткин 30 ноября 2015, 11:19 # 0
                                                                        Может, в путях надо прописать вот так?
                                                                        core/components/partrequest/model/partrequest/
                                                                      2. Паша 30 ноября 2015, 11:38 # 0
                                                                        Поменял тут:
                                                                        [{"partrequest":{"path":"[[++core_path]]components/partrequest/model/"]}}
                                                                        на
                                                                        [{"partrequest":{"path":"/core/components/partrequest/model/"]}}
                                                                        Те же, только в профиль
                                                                        [2015-11-30 14:31:15] (ERROR @ /connectors/index.php) Path specified for package partrequest is not a valid or accessible directory: /core/components/partrequest/model/
                                                                        Эти ошибки лезут, когда заходишь на страницу CMP Generator в админке.
                                                                        1. Илья Уткин 30 ноября 2015, 13:11 # 0
                                                                          Попробуйте так:
                                                                          [ {"partrequest":{"path":"[[++core_path]]components/partrequest/model/partrequest/"}} ]
                                                                          1. Паша 30 ноября 2015, 13:41 # 0
                                                                            С самым первым вариантом
                                                                            [ {"partrequest":{"path":"[[++core_path]]components/partrequest/model/"}} ]
                                                                            проблема была в синтаксисе квадратных скобок, в начале и в конце, недосмотрел, вот что значит копипастить. Тег <code>, если без пробела пододвигает квадратную скобку влево на два символа.
                                                                            Хотя pdoPage с ошибочным синтаксисом в настройке extension_packages отрабатывал нормально и выводил данные из таблицы. Матюкался только CMP Generator.

                                                                            Спасибо большое за внимание и за советы. :)
                                                                        2. Паша 13 января 2016, 12:56 # 0
                                                                          Здравствуйте. Скажите пожалуйста, почему ExamSheetRemoveProcessor, из базы не удаляет, а просто оставляет все поля пустыми, кроме id. ??
                                                                          1. Илья Уткин 13 января 2016, 12:57 # 0
                                                                            Не знаю… По идее должен удалять… Глюк какой-то
                                                                          2. amsterdam 02 марта 2016, 10:38 # 0
                                                                            Илья, подскажите.а как выводите код сниппета в теле статьи?? Он же интерпретируется Modx как вызов сниппета, и не отображается! Как у вас получается его вывести как текст? Вижу prettyprint. но он же просто стилизует. Как добиться того что бы на странице в статье сниппет не обрабатывался?!
                                                                            1. Илья Уткин 24 марта 2016, 11:29 # 0
                                                                              Это Jevix преобразует квадратные скобки в HTML-сущности.
                                                                              1. amsterdam 25 марта 2016, 05:05 # 0
                                                                                Да. я за месяц уже разобрался, но спасибо))
                                                                            2. krok 24 марта 2016, 09:52 # 0
                                                                              Здравствуйте! Илья, а если обрабатывать форму не с помощью Formit, а с помощью компонента Login? Как тогда сделать запись в БД? Так, как в коде ниже, запись не получается.
                                                                              [[!Register?
                                                                                  &postHooks=`employeesForms`
                                                                                  &submitVar=`registerbtn`
                                                                                  &activationEmailTpl=`userLgnActivateEmailTpl`
                                                                                  &activationEmailSubject=`Спасибо за регистрацию!`
                                                                                  &usergroups=`Users::Member`
                                                                                  &submittedResourceId=`4`
                                                                                  &activationResourceId=`7`
                                                                                  &validate=`firstname:required,
                                                                                             secondname:required,
                                                                                             mail:required`
                                                                              ]]
                                                                              
                                                                              1. Илья Уткин 24 марта 2016, 11:34 # 0
                                                                                По идее всё должно работать. Сниппет employeesForms запустится при удачной регистрации. В нем и должно происходить добавление записи в БД
                                                                              2. morzzrom 02 апреля 2016, 13:54 # 0
                                                                                Илья, добрый день!
                                                                                Хочу уточнить, как возможно в xpdo сделать проверку на существование записи в базе данных. И если она существует, то переписывать данные. То есть, пользователь может создать только одну запись и потом ее менять, но новые не создаются.
                                                                                И второй момент, как привязать условие чтобы у каждого пользователя, например, была возможность создать новую запись раз в году? Например, в 2015 году пользователь записывает данные, в течение года их редактирует, и как только начинается 2016 год, то старая запись за 2015 год становится запрещенной к редактированию и создается новая…
                                                                                Вопрос, кажется, трудный :( Или подскажите, пожалуйста, где можно про это прочитать и куда копать? Спасибо
                                                                                1. Илья Уткин 04 апреля 2016, 13:10 # 0
                                                                                  Вот все эти проверки и надо прописывать в процессорах создания и обновления. Готового рецепта я не дам, но всё это реализуемо. Надо просто посидеть и подумать над кодом
                                                                                2. NewUser 06 апреля 2016, 15:35 # 0
                                                                                  Здравствуйте! А как будет прописана выборка здесь, если нужно вывести данные из БД о конкретном пользователе на его личную страницу? (у всех пользователей свои личные кабинеты):
                                                                                  [[!pdoPage?
                                                                                      &class=`EmployeesForms`
                                                                                      &tpl=`tpl.employeesForms`
                                                                                      &element=`getForms`
                                                                                      &where=`?????????????`
                                                                                  ]]
                                                                                  [[!+page.nav]]
                                                                                  1. Илья Уткин 06 апреля 2016, 15:40 # 0
                                                                                    Вот выше пример кода: ilyaut.ru/xpdo/adding-editing-and-deleting-custom-objects/#comment-277
                                                                                    Нужно знать, в каком поле хранятся данные о принадлежности к пользователю
                                                                                  2. NewUser 07 апреля 2016, 10:05 # 0
                                                                                    Сейчас извиняюсь за вопросы новичка…

                                                                                    Страницы пользователям создаю по вашей инструкции отсюда: ilyaut.ru/tips-and-tricks/develop-a-social-network-on-modx-revolution/
                                                                                    Получается, нужно как то связать ресурс с соответствующей строкой в БД?
                                                                                    Можно, например, по полю username или email?
                                                                                    1. Илья Уткин 07 апреля 2016, 10:12 # 0
                                                                                      Ну да, связь какая-то должна быть. И уже по полю связи делать выборку
                                                                                      1. NewUser 07 апреля 2016, 11:28 # 0
                                                                                        Илья, большое спасибо за быстрые ответы!

                                                                                        Пробую делать так. По идее, он же должен показывать все поля пользователя, у которого username совпадает с firstname. Но выдает по-прежнему полный список.
                                                                                        [[!pdoPage?
                                                                                            &class=`ExamSheet`
                                                                                            &tpl=`tpl.examSheet`
                                                                                            &element=`getSheet`
                                                                                            &where=`{«created_by»:[[!+modx.user.id:firstname=`username`]]}`
                                                                                        ]]
                                                                                        [[!+page.nav]]
                                                                                        Может быть дело в этом:
                                                                                        А как в этом чанке записать username пользователя (ссылку), который будет выводиться не из базы данных, а из формы или из ресурса?
                                                                                        <tr>
                                                                                            <td>[[+id]]</td>
                                                                                            <td><a href="[[~67? &sheet=`[[+id]]`]]">['username']</a></td>
                                                                                            <td>[[+firstname]]</td>
                                                                                            <td>[[+secondname]]</td>
                                                                                            <td>[[+email]]</td>
                                                                                        </tr>
                                                                                        1. Илья Уткин 11 апреля 2016, 08:38 # 0
                                                                                          Вот так должен выглядеть параметр where
                                                                                          &where=`{"created_by":[[!+modx.user.id]]}`
                                                                                    2. krok 13 апреля 2016, 13:55 # 0
                                                                                      Делаю все по инструкции. При редактировании данных создается новая строка в БД с новыми записями. В чем может быть ошибка? Как сделать так, чтобы не создавалась строка, а редактировалась первоначальная для этого пользователя?
                                                                                      Страница редактирования:
                                                                                      [[!getFormsData?]]
                                                                                      [[!FormIt?
                                                                                       &hooks=`employeesForms,direct`
                                                                                       &successMessage=`Изменения сохранены`
                                                                                       &validate=`email:required,
                                                                                                 firstname:required,
                                                                                                 secondname: required,
                                                                                                 username: validate`
                                                                                      ]]
                                                                                      <p>[[+fi.error.error_message]]</p>
                                                                                      <form class="form" action="[[~[[*id]]]]" method="post" enctype="multipart/form-data" >
                                                                                          <input name="nospam:blank" type="hidden" />
                                                                                          <input name="resource_id" type="hidden" value="[[+fi.id]]" />
                                                                                          <input id="parent" name="parent" type="hidden" type="text" value="[[+fi.parent]]" /> 
                                                                                          <div>
                                                                                          <label>Username:</label>
                                                                                          <span class="error">[[+fi.error.username]]</span>
                                                                                          <input name="username" type="text" value="[[+fi.username]]" />
                                                                                      </div> 
                                                                                      <div>
                                                                                          <label>Почта:</label>
                                                                                          <span class="error">[[+fi.error.email]]</span>
                                                                                          <input name="email" type="text" value="[[+fi.email]]" />
                                                                                      </div>  
                                                                                      <div>  
                                                                                          <label>Имя:</label>
                                                                                          <span class="error">[[+fi.error.firstname]]</span>
                                                                                          <input id="firstname" name="firstname" type="text" value="[[+fi.firstname]]" />
                                                                                      </div>
                                                                                      <div>    
                                                                                          <label>Фамилия:</label>
                                                                                          <span class="error">[[+fi.error.secondname]]</span>
                                                                                          <input id="secondname" name="secondname" type="text" value="[[+fi.secondname]]" />
                                                                                      </div>
                                                                                      
                                                                                      <br class="clear" />
                                                                                      <div class="form-buttons">v
                                                                                              <input type="submit" value="Отправить" />
                                                                                      </div>
                                                                                      </form>
                                                                                      Сниппет getFormsData:
                                                                                      <?php
                                                                                      if ($_GET['forms'] && $forms = $modx->getObject('EmployeesForms', $_GET['forms'])) {
                                                                                          $modx->setPlaceholders($forms->toArray());
                                                                                      }
                                                                                      1. Илья Уткин 13 апреля 2016, 14:18 # 0
                                                                                        Так сложно сказать… Нужно проверять, что приходит на сервер, есть ли ID, найден ли объект с таким ID и т. д.
                                                                                        1. krok 15 апреля 2016, 18:09 # 0
                                                                                          А как в этом сниппете идет проверка по id?
                                                                                          if ($_GET['sheet'] && $sheet = $modx->getObject('ExamSheet', $_GET['sheet'])) {
                                                                                              $modx->setPlaceholders($sheet->toArray());
                                                                                          }
                                                                                          «Соответственно, если вы припишете к адресу страницы добавления get-параметр sheet с id-шником нужного объекта, вы получите форму, заполненную данными объекта. А в сниппете examSheet у нас уже заложено разветвление — если указан id объекта, используется процессор update. „

                                                                                          Что то недопонимаю…
                                                                                          Но думаю, что ошибка тут.
                                                                                          1. Илья Уткин 15 апреля 2016, 18:36 # 0
                                                                                            Вот здесь это разветвление:
                                                                                            if (!$_POST['sheet']) {
                                                                                                $processor = 'sheet/create';
                                                                                            } else {
                                                                                                $_POST['id'] = $_POST['sheet'];
                                                                                                $modx->setPlaceholder('id', $_POST['id']);
                                                                                                $processor = 'sheet/update';
                                                                                            }
                                                                                      2. KateHudson 24 апреля 2016, 13:03 # 0
                                                                                        Здравствуйте!
                                                                                        Необходимо вывести информацию из БД текущего пользователя.
                                                                                        Вывод полного списка работает без проблем,
                                                                                        а при такой записи:
                                                                                        [[!pdoPage?
                                                                                            &class=`ExamSheet`
                                                                                            &tpl=`tpl.examSheet`
                                                                                            &element=`getSheets`
                                                                                            &where=`{"created_by":[[!+modx.user.id]]}`
                                                                                        ]]
                                                                                        [[!+page.nav]]
                                                                                        результат не приходит и появляется ошибка [2016-04-24 12:58:55] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column 'ExamSheet.created_by' in 'where clause'
                                                                                        1. Илья Уткин 25 апреля 2016, 01:12 # 0
                                                                                          Эта ошибка означает, что в табличке нет поля created_by
                                                                                          1. KateHudson 25 апреля 2016, 14:12 # 0
                                                                                            Точно, глупая ошибка.
                                                                                            Спасибо! Получилось
                                                                                        2. Дарья Жуланова 25 апреля 2016, 15:13 # 0
                                                                                          Доброго времени суток, Илья!
                                                                                          На сайте реализована динамическая форма с помощью JS (добавление задач пользователями).
                                                                                          Если каждый раз при изменении БД, мы заново генерируем пакет, то подскажите пожалуйста, как сделать запись каждой задачи в базу данных? Количество задач может быть произвольным.
                                                                                          1. Илья Уткин 25 апреля 2016, 15:17 # 0
                                                                                            Так в этой статье и описан основной способ добавление записей в базу данных
                                                                                          2. Мишка Вседовольный 14 июля 2016, 15:03 # 0
                                                                                            а у меня все равно не получается сделать отображение и редактирование созданных пользователей в бд. И открывать по конкретному ID тоже не хочет.
                                                                                            <?php
                                                                                            if (!$_POST['info']) {
                                                                                                $processor = 'info/create';
                                                                                            } else {
                                                                                                $_POST['id'] = $_POST['info'];
                                                                                                $modx->setPlaceholder('id', $_POST['id']);
                                                                                                $processor = 'info/update';
                                                                                            }
                                                                                            $processorProps = array('processors_path' => $modx->getOption('core_path')
                                                                                                           . 'components/pers/processors/');
                                                                                            $response = $modx->runProcessor($processor, $_POST, $processorProps);
                                                                                            if ($response->isError()) {
                                                                                                $hook->addError('process_error', $response->getMessage());
                                                                                                return false;
                                                                                            }
                                                                                            return true;
                                                                                            воторой
                                                                                            <?php
                                                                                            if ($_GET['info'] && $info = $modx->getObject('PersInfo', $_GET['info'])) {
                                                                                                $modx->setPlaceholders($info->toArray());
                                                                                            }когда попустим просматриваю пользователей по /index.php?id=2
                                                                                            — отображается весь список,

                                                                                            Отображение по /index.php?id=2&info=12 — ничего и не меняется
                                                                                            1. Мишка Вседовольный 18 июля 2016, 12:43(Комментарий был изменён) # 0
                                                                                              ну хотябы скажите, почему не заменяет данные из бд??
                                                                                              т.к. данные заносят в таблицу, и так же выводятся, что в общий список что по конткретному id!
                                                                                              например ID=2&info=6 — данные заполняются в форму.
                                                                                              Но при изменении поля любого поля — создается новая строка в таблице а не редактируется предыдущий пользователь!

                                                                                              процессоры добавлены и сниппеты тоже.
                                                                                              1. Илья Уткин 18 июля 2016, 12:53 # 0
                                                                                                Если создаётся новая запись, значит, используется процессор create, а не update. Что-то не так в условии
                                                                                                if (!$_POST['info']) {
                                                                                                    $processor = 'info/create';
                                                                                                    print "Cобираюсь использовать процессор create"; die();
                                                                                                } else {
                                                                                                    $_POST['id'] = $_POST['info'];
                                                                                                    $modx->setPlaceholder('id', $_POST['id']);
                                                                                                    $processor = 'info/update';
                                                                                                    print "Cобираюсь использовать процессор update"; die();
                                                                                                }
                                                                                                1. Мишка Вседовольный 18 июля 2016, 13:09(Комментарий был изменён) # 0
                                                                                                  Ну так это естественно)))) я про то, что может быть не так, если условие Else не выполняется?))) т.к. я уже несколько дней ломаю голову. пробывал без create процессора — всеравно не заменяет.
                                                                                                  1. Илья Уткин 18 июля 2016, 13:13 # 0
                                                                                                    Если не выполняется else, значит, $_POST['info'] в сниппет не передаётся
                                                                                                    1. Мишка Вседовольный 18 июля 2016, 13:54(Комментарий был изменён) # 0
                                                                                                      )) ну все равно спасибо за помощь! буду искать решение. Правда кроме вашего ресурса нигде развернутой информации тольком и не найти.
                                                                                                      1. Мишка Вседовольный 18 июля 2016, 14:27(Комментарий был изменён) # 0
                                                                                                        ну и собственно а какя переменная подразумевается под $_POST['info'] изначально? и где она определяет свое значение (помимо бд), где ей задается это значение?

                                                                                                        видимо с модиксом подружится не так уж и просто.

                                                                                                        так как
                                                                                                        if ($_GET['info'] && $info = $modx->getObject('PersInfo', $_GET['info'])) {
                                                                                                            $modx->setPlaceholders($info->toArray());
                                                                                                        }
                                                                                                        $_GET[''] запрашивает по дефолту значение после .php?name= а тут…

                                                                                                        в общем что я не могу понять. = Почему по .php?id=2&info=6 данные выводятся, но не заменяются. хотя $GET задает а $post не получает О_о???, для меня загадка… Причем все ссылки с данным вопросом ведут к вам)))) мне страшно!!!xD
                                                                                                        1. Мишка Вседовольный 18 июля 2016, 16:21(Комментарий был изменён) # 0
                                                                                                          У кого не перезаписывались данные в бд!!! ВНИМАНИЕ!!!! — проблема в том, что данный пример == костыль и имеет прямой вывод индекса ID в шаблон, ане в .log(e) и т.д.

                                                                                                          Потому надо ставить
                                                                                                          <input name="info" value="[[!+id]]"/>

                                                                                                          может есть и более правильные способ определения, но я его не нашел.
                                                                                                          1. Илья Уткин 18 июля 2016, 16:34 # 0
                                                                                                            Ну такое поле в статье есть. Только у меня не info, а sheet. Значит, просто невнимательно скопировали код формы))
                                                                                                            1. Мишка Вседовольный 18 июля 2016, 16:48 # 0
                                                                                                              Ну естественно))) просто форму сам делал, по аналогии.
                                                                                                              1. Мишка Вседовольный 20 июля 2016, 11:55(Комментарий был изменён) # 0
                                                                                                                а как в процессоре create указать в таблицу данные профиля пользователя
                                                                                                                заместо
                                                                                                                $this->$modx->user->id
                                                                                                                например
                                                                                                                $this->$modx->userprofile->fullname
                                                                                                                это образно, просто не знаю как запросить данные из таблицы modx_user_attributes
                                                                                                                1. Илья Уткин 20 июля 2016, 11:57 # 0
                                                                                                                  $this->modx->user->Profile->fullname
                                                                                                                  1. Мишка Вседовольный 20 июля 2016, 12:25 # 0
                                                                                                                    спасибо!!!
                                                                                                  2. Мишка Вседовольный 18 июля 2016, 12:51 # 0
                                                                                                    или какие элементы обязательны для изменения данных уже созданной записи в бд!
                                                                                                    1. morzzrom 21 августа 2016, 21:01(Комментарий был изменён) # 0
                                                                                                      Илья, вопрос по теме статьи.
                                                                                                      В процессоры редактирования и добавления данных можно ли добавить проверку, чтобы администратор-менеджер с каким то id мог редактировать-создавать данные для пользователей, но и другие пользователи не могли работать с данными чужих пользователей?
                                                                                                      То есть предполагаю сделать как то так проверку в процессорах редактирования и создания:
                                                                                                      public function beforeSet() {
                                                                                                      if $UserID = 8 return true; (проверяем на айди администратора) (????????????)
                                                                                                              if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                                                                                                              if ($this->object->get('created_by') != $this->modx->user->id)
                                                                                                                  return 'Вы не можете редактировать чужие записи';
                                                                                                              return true;
                                                                                                          }
                                                                                                      Или это вообще неправильный подход? и как написать корректно. У меня пока что не работает :(
                                                                                                      1. Илья Уткин 22 августа 2016, 10:14 # 0
                                                                                                        Да, думаю, должно заработать
                                                                                                        public function beforeSet() {
                                                                                                            if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                                                                                                            if ($this->modx->user->id == 8) return true;
                                                                                                            if ($this->object->get('created_by') != $this->modx->user->id)
                                                                                                                return 'Вы не можете редактировать чужие записи';
                                                                                                            return true;
                                                                                                        }
                                                                                                        1. morzzrom 29 августа 2016, 14:11 # 0
                                                                                                          Да, в принципе так работает. Также надо добавить в сниппет getSheetData вот такую запись:
                                                                                                          if ($sheet->get('created_by') == $modx->user->id) {
                                                                                                              $modx->setPlaceholders($sheet->toArray());
                                                                                                              }
                                                                                                              else if ($modx->user->id == 8)
                                                                                                              {
                                                                                                                  $modx->setPlaceholders($sheet->toArray());
                                                                                                              }
                                                                                                          Тогда точно будет работать.

                                                                                                          Илья, теперь вот другой вопрос. По прямой ссылке с каким то id, если я авторизована под администратором, я могу увидеть данные пользователя. Я про это: «если вы припишете к адресу страницы добавления get-параметр sheet с id-шником нужного объекта»
                                                                                                          В связи с этим вопрос, а как я могу программно сделать эту ссылку. Чтобы например, нажимаешь — «редактировать» и входишь на редактирование какого-то пользователя.
                                                                                                          У меня организовано следующим образом: администратор входит на страницу какого то пользователя: просматривает его данные. Это я сделала с помощью GET и where. Администратору выдается список пользователей и он может посмотреть их данные.

                                                                                                          Но вот теперь я не могу с страницы просмотра данных пользователя перейти на страницу редактирования его данных. Второй раз GET не получается сделать. Как сделать? Что-то не пойму. Надеюсь, понятно объяснила.
                                                                                                          Спасибо.
                                                                                                          1. morzzrom 29 августа 2016, 17:49(Комментарий был изменён) # 0
                                                                                                            Ответ, может кому пригодится:
                                                                                                            <a href="[[~11]]?sheet=[[!GET?&sheet=`sheet`]]">    Редактировать</a>
                                                                                                      2. morzzrom 29 августа 2016, 19:42 # 0
                                                                                                        Илья, я сейчас в некоторой растерянности. Почему-то администратор видит и может редактировать данные только одного пользователя, условно демопользователя… А остальных почему-то нет, даже по прямой ссылке. Думала, что проблема с правами доступа. Проверила — загрузила одного другого в группу демопользователя — не работает. Как и обратная ситуация.
                                                                                                        С чем это может быть связано? Мысли есть?
                                                                                                        1. Спартак Ян 04 ноября 2016, 18:48 # 0
                                                                                                          Спасибо за урок. Раскрыли глаза

                                                                                                          Вопрос. После сохранения записи отправляет на начальную страницу сайта, а не на текущую
                                                                                                          1. Илья Уткин 07 ноября 2016, 07:39 # +1
                                                                                                            В параметре &redirectTo=`1` нужно указать ID нужной страницы для редиректа
                                                                                                          2. Kgb3000 08 ноября 2016, 02:53 # 0
                                                                                                            Помогите подвязать таблицу с выбором предметов.
                                                                                                            Не могу осилить left join для pdoPage.

                                                                                                            1. Спартак Ян 10 ноября 2016, 02:05(Комментарий был изменён) # 0
                                                                                                              Таблицы:
                                                                                                              Новая
                                                                                                              ExamSubjectSheet (modx_exam_subject_sheet)
                                                                                                              id (INT), sub_title (TEXT)

                                                                                                              Редактируем
                                                                                                              ExamSheet (modx_exam_sheet)
                                                                                                              subject (INT)

                                                                                                              &leftJoin=`{"Subject": {
                                                                                                              		"class": "ExamSubjectSheet",
                                                                                                              		"on": "ExamSheet.subject = Subject.id"
                                                                                                              		}
                                                                                                              	}`
                                                                                                              	&select=`{
                                                                                                              		"ExamSheet": "*",
                                                                                                              		"Subject": "sub_title"
                                                                                                              	}`
                                                                                                            2. Спартак Ян 10 ноября 2016, 02:00 # 0
                                                                                                              при редактировании или удаление записи
                                                                                                              Ошибка! object_err_ns
                                                                                                              1. Виталий 17 ноября 2016, 10:01 # 0
                                                                                                                День добрый!
                                                                                                                Не подскажите как реализовать:
                                                                                                                На против каждой записи кнопка, при нажатии ее запись должна копироваться в другую таблицу.
                                                                                                                1. Анатолий 03 декабря 2016, 21:32 # 0
                                                                                                                  Все изложено очень хорошо. Спасибо, Илья.
                                                                                                                  Еще бы немного поподробнее про редактирование и удаление объектов. Никак не получается редактирование и удаление объектов.
                                                                                                                  1. Анатолий 26 декабря 2016, 13:23 # 0
                                                                                                                    Илья, подскажите как при выводе таблицы списка объектов здесь ilyaut.ru/xpdo/adding-editing-and-deleting-custom-objects/ вывести номер итерации в каждой строке таблицы.
                                                                                                                    1. Илья Уткин 26 декабря 2016, 15:05 # 0
                                                                                                                      Плейсхолдер [[+idx]] — его проставляет pdoResources
                                                                                                                    2. Максим 09 января 2017, 10:40 # 0
                                                                                                                      Доброго дня! Подскажите пожалуйста, будет ли работать с такой таблицей mFilter2 без каких либо доработок?
                                                                                                                      1. Илья Уткин 09 января 2017, 10:56 # 0
                                                                                                                        Не знаю… mFilter2 работает через mSearch2, который индексирует только таблицу modx_site_content. Так что без дополнительной настройки вряд ли всё заработает…
                                                                                                                        1. Максим 09 января 2017, 10:59 # 0
                                                                                                                          Понял, спасибо за хороший урок)
                                                                                                                      2. Анатолий 13 января 2017, 18:44 # 0
                                                                                                                        Илья, Очень полезный урок, спасибо.
                                                                                                                        Подскажите, как в вашей таблице «Деканат инфо» в строке таблицы вывести значение переменной шаблона,
                                                                                                                        если Студент — это значение ID ресурса.
                                                                                                                        Понятно что надо аккуратно составить и шаблон вывода строки и аккуратно передать параметр в сниппет.
                                                                                                                        Всего-то нужно один параметр ID ресурса передать в сниппет и получить значение TV.
                                                                                                                        Для одного ресурса таким сниппетом

                                                                                                                        <?php
                                                                                                                        /*  Получаем значение TV по ID ресурса и ID TV  */
                                                                                                                        $where = array(
                                                                                                                                'contentid' => $idres       
                                                                                                                              , 'tmplvarid' => $idtv      // ID TV =4       
                                                                                                                            );
                                                                                                                        $tv = $modx->getObject('modTemplateVarResource', $where);            //получен объект TV для  $idtv    
                                                                                                                        $tvvalue  = $tv->get('value');                   //по объекту получено значение 
                                                                                                                        return $tvvalue;
                                                                                                                        
                                                                                                                        получить значение TV удается, а вот для нескольких строк не получается.
                                                                                                                        1. Илья Уткин 16 января 2017, 08:22 # 0
                                                                                                                          Надо просто не для нескольких, а для каждого в отдельности, в каждой строке отдельно вызывать этот сниппет.
                                                                                                                          1. Анатолий 16 января 2017, 08:47 # 0
                                                                                                                            Илья, Если не затруднит подскажите пример чанка tpl.examSheet: для данного случая
                                                                                                                            1. Илья Уткин 16 января 2017, 10:29 # 0
                                                                                                                              Так навскидку вряд ли смогу написать. Пробуйте, экспериментируйте…
                                                                                                                        2. Роман 09 марта 2017, 14:36 # 0
                                                                                                                          Илья, спасибо большое за урок, с ваших уроков взял старт на работу со своими таблицами. Но не могу разобраться как обновлять или удалять записи из таблиц. При удаллении добавляются и все, дублируется запись.

                                                                                                                          Вот пример кода по вашему уроку, даже задача проще:

                                                                                                                          Форма
                                                                                                                          [[!getEventData]]
                                                                                                                          [[!FormIt?  
                                                                                                                            &hooks=`runnerEvent,redirect`
                                                                                                                            &redirectTo=`[[+id]]`
                                                                                                                            &placeholderPrefix=``
                                                                                                                          ]]
                                                                                                                          
                                                                                                                            <form action="[[~[[*id]]]]" method="post">
                                                                                                                              <input type="hidden" name="page_id" value="[[!*id]]">
                                                                                                                              <input type="hidden" name="user_id" value="[[!+modx.user.id]]">
                                                                                                                          	 <input type="hidden" name="title" value="[[!*pagetitle]]"> 
                                                                                                                          
                                                                                                                                <div class="form-group">
                                                                                                                                    <button type="submit" class="button medium-btn">Принять участие</button>
                                                                                                                                    <button type="submit" class="button medium-btn" name="remove" value="remove" onclick="return confirm('Удалить событие?')">Игнорировать событие</button>
                                                                                                                                </div>
                                                                                                                          
                                                                                                                            </form>
                                                                                                                          
                                                                                                                          Вот сниппет getEventData
                                                                                                                          <?php
                                                                                                                          if ($_GET['event'] && $event = $modx->getObject('RunnerEvent', $_GET['event'])) {
                                                                                                                              $modx->setPlaceholders($event->toArray());
                                                                                                                          }
                                                                                                                          
                                                                                                                          Вот сниппет runnerEvent
                                                                                                                          <?php
                                                                                                                          if (!$_POST['event']) {
                                                                                                                              $processor = 'event/create';
                                                                                                                          } else {
                                                                                                                              $_POST['id'] = $_POST['event'];
                                                                                                                              $modx->setPlaceholder('id', $_POST['id']);
                                                                                                                              
                                                                                                                              if ($_POST['remove']) {
                                                                                                                                  $processor = 'event/remove';
                                                                                                                              } else {
                                                                                                                                  $processor = 'event/update';
                                                                                                                              }
                                                                                                                          }
                                                                                                                          $processorProps = array('processors_path' => $modx->getOption('core_path'). 'components/Runner/processors/');
                                                                                                                          $response = $modx->runProcessor($processor, $_POST, $processorProps);
                                                                                                                          if ($response->isError()) {
                                                                                                                              $hook->addError('process_error', $response->getMessage());
                                                                                                                              return false;
                                                                                                                          }
                                                                                                                          return true;
                                                                                                                          

                                                                                                                          Вот код из файла класса:

                                                                                                                          <?php
                                                                                                                          class RunnerEventRemoveProcessor extends modObjectRemoveProcessor {
                                                                                                                          
                                                                                                                              public $classKey = 'RunnerEvent';
                                                                                                                              public $objectType = 'object';
                                                                                                                              
                                                                                                                              public function beforeRemove() {
                                                                                                                                  if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                                                                                                                                  //if ($this->object->get('created_by') != $this->modx->user->id)
                                                                                                                                  //  return 'Вы не можете удалять чужие записи';
                                                                                                                                  return true;
                                                                                                                              }
                                                                                                                          
                                                                                                                          }
                                                                                                                          return 'RunnerEventRemoveProcessor';
                                                                                                                          
                                                                                                                          В чем может быть соль? Куда копать хотя бы расскажите, задача простая, пользователь подписывается на событие, которое создается другими пользователями через снипет Ticket.
                                                                                                                          В табличку кладется Id страницы, пользователя, и заголовок страницы. По вашему уроку порядок, все добавляется, а вот отредактировать не могу, скорее даже удалить. Просто юзер снова подписывается на страницу (добавляется запись новая, дубль), где ошибся? Подскажите направление, место, снипет где не то, я подозреваю вот тут проблема
                                                                                                                          if (!$_POST['event']) $processor = 'event/create'; все время выполняет это условие и дальше не идет, создает и создает.
                                                                                                                          1. Илья Уткин 09 марта 2017, 14:45 # 0
                                                                                                                            Добавьте в форму
                                                                                                                            <input type="hidden" value="[[!+id]]" name="event">
                                                                                                                            Чтобы сниппет знал, что id есть, значит, и объект есть
                                                                                                                            1. Роман 09 марта 2017, 14:53(Комментарий был изменён) # 0
                                                                                                                              Уф спасибо большое! Пошло удаление, был близок, но не сообразил :)
                                                                                                                              Единственное удаление только с GET параметром с ID удаляемой страницы работает, можно как то без GET параметра удалить запись из БД? Мы же все равно знаем ID страницы удаляемой.
                                                                                                                              1. Илья Уткин 09 марта 2017, 14:59 # 0
                                                                                                                                Ну да, надо просто этот ID передать в POST-параметре event
                                                                                                                          2. Спартак Ян 17 марта 2017, 11:51(Комментарий был изменён) # 0
                                                                                                                            Создал таблицы modx_booking_service, modx_booking_status, modx_booking_item и заполнил
                                                                                                                            CMP Generator сгенерировал модель Booking
                                                                                                                            tables modx_booking_service, modx_booking_status, modx_booking_item
                                                                                                                            extension_packages
                                                                                                                            ...,{"Booking":{"path":"[[++core_path]]components/Booking/model/"}}
                                                                                                                            Join все связал и замечательно отображает (отдельное спасибо за урок )
                                                                                                                            Но вдруг возникла непонятная проблема с выводом данных таблиц по отдельности:
                                                                                                                            [[!pdoResources? &class=`BookingItem`&showlog=`1`]
                                                                                                                            выводит ресурсы

                                                                                                                            [[!pdoResources? &class=`BookingService`&showlog=`1`]
                                                                                                                            не выводит

                                                                                                                            [[!pdoResources? &class=`BookingStatus`&showlog=`1`]
                                                                                                                            не выводит
                                                                                                                            1. Спартак Ян 17 марта 2017, 12:24 # 0
                                                                                                                              Разобрался, упусти &sortby=`BookingService.id`
                                                                                                                            2. Спартак Ян 17 марта 2017, 20:29(Комментарий был изменён) # 0
                                                                                                                              Помогите вывести данные для редактирования для типов date и select в форме
                                                                                                                              Placeholder не срабатывает :(

                                                                                                                              полe select

                                                                                                                              <select class="form-control" id="course" name="course">
                                                                                                                                  <option value="2">Второй курс</option>
                                                                                                                                  <option value="1">Первый курс</option>
                                                                                                                              </select>
                                                                                                                              input type=«date»

                                                                                                                              <input type="date" value="[[!+date]]" class="form-control"
                                                                                                                                        id="date" name="date" placeholder="2017-01-01 00:00:00">
                                                                                                                              1. Спартак Ян 17 марта 2017, 21:29(Комментарий был изменён) # 0
                                                                                                                                С датой разобрался
                                                                                                                                <input type="date" value="[[!+date:strtotime:date=`%Y-%m-%d`]]" class="form-control"  id="date" name="date" >
                                                                                                                                1. Спартак Ян 17 марта 2017, 22:23(Комментарий был изменён) # 0
                                                                                                                                  я близок и далек

                                                                                                                                  <select class="form-control" id="course" name="course">
                                                                                                                                  [[!pdoResources?
                                                                                                                                  	&class=`ExamCourse`
                                                                                                                                  	&sortby=`ExamCourse.course_id`
                                                                                                                                          &tpl=`@INLINE <option [[+course:is=`[[+course_id]]`:then=`selected`:else=``]]  value="[[+course_id]]">[[+course_title]]</option>`
                                                                                                                                  ]]
                                                                                                                                  </select>
                                                                                                                                  1. Спартак Ян 18 марта 2017, 10:21(Комментарий был изменён) # 0
                                                                                                                                    Поставил такую заплатку, все заработало

                                                                                                                                    [[!pdoResources?
                                                                                                                                        &class=`ExamCourse`
                                                                                                                                        &sortby=`ExamCourse.course_id`
                                                                                                                                        &tpl=`@INLINE <option selected value="[[+course_id]]">[[+course_title]]</option>`
                                                                                                                                        &where=`{"course_id:=":"[[+course]]"}`
                                                                                                                                        &limit=`1`
                                                                                                                                    ]]
                                                                                                                                    [[!pdoResources?
                                                                                                                                        &class=`ExamCourse`
                                                                                                                                        &sortby=`ExamCourse.course_id`
                                                                                                                                        &tpl=`@INLINE <option selected value="[[+course_id]]">[[+course_title]]</option>`
                                                                                                                                        &where=`{"course_id:!=":"[[+course]]"}`
                                                                                                                                        &limit=`0`
                                                                                                                                    ]]
                                                                                                                                    1. Илья Уткин 20 марта 2017, 09:22 # 0
                                                                                                                                      В @INLINE-чанках не работают модификаторы. Это прямо в документации написано. Можно использовать Fenom-синтаксис:
                                                                                                                                      <select class="form-control" id="course" name="course">
                                                                                                                                      [[!pdoResources?
                                                                                                                                      	&class=`ExamCourse`
                                                                                                                                      	&sortby=`ExamCourse.course_id`
                                                                                                                                              &tpl=`@INLINE <option {if $course == '[[+course_id]]'}selected{/if}  value="[[+course_id]]">[[+course_title]]</option>`
                                                                                                                                      ]]
                                                                                                                                      </select>
                                                                                                                                2. Никита 07 июля 2017, 12:41 # 0
                                                                                                                                  Здравствуйте Илья! Очень полезный урок, спасибо.
                                                                                                                                  Подскажите пожалуйста как можно студенту например загрузить на сервер свою контрольную? И чтобы с файлами можно было работать как с остальными полями в контексте текущего урока.
                                                                                                                                  Если вопрос в печеньках — пишите на почту.
                                                                                                                                  Буду благодарен.
                                                                                                                                  1. Илья Уткин 13 июля 2017, 08:29 # 0
                                                                                                                                    С загрузкой всё не так просто. Как только возникает необходимость что-то загружать, нужно проверять, что такие файлы не нанесут вреда серверу, не займут всё свободное место и пр. Так что для такого лучше использовать какие-нибудь готовые решения, например, Uploadify.
                                                                                                                                  2. irGuch 01 августа 2017, 09:12(Комментарий был изменён) # 0
                                                                                                                                    Илья, привет! Разбирался с этим туториалом и сталкнулся с такой проблемой. Прописал в сниппете examSheet не правильный путь — components/ExamSheet/processors/ (не дописал букву s в processors).
                                                                                                                                    В результате ничего не происходило, и стало мне любопытно, а как же мне найти ошибку? Искал я эту ошибку долго, а логи пустые.

                                                                                                                                    В общем вопрос такой, как во время разработки мне отлавливать подобные ошибки, с опечатками и прочим?
                                                                                                                                    1. Илья Уткин 02 августа 2017, 07:01 # 0
                                                                                                                                      Наверное, просто отключён вывод ошибок. Включить показ предупреждений и ошибок PHP

                                                                                                                                    Авторизация

                                                                                                                                    через сервис Loginza:

                                                                                                                                    Подписка или RSS

                                                                                                                                    Буду присылать новые статьи — никакого спама



                                                                                                                                    Шаблоны MODX

                                                                                                                                    1 2 Дальше »

                                                                                                                                    Объектная
                                                                                                                                    модель
                                                                                                                                    MODX