Загрузка файла с записью в БД

Здравствуйте.
Сделал форму, которая отправляет данные в отдельную таблицу БД. Форма работает с помощью AjaxForm и своего сниппета. Запись в БД идет с помощью своего класса, самого простейшего:
<?php
class ZPSCreateProcessor extends modObjectCreateProcessor {

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

return 'ZPSCreateProcessor';
Но у меня ряд примитивных вопросов, прошу помощи разобраться или ткните носом, где почитать:

1. У меня в моей таблице присутствует поле createdon — туда нужно писать дате записи данных. Какую функцию использовать для этого в классе?
2. Самый важный и для меня пока сложный момент — у меня есть поле для загрузки фото. Как мне сделать, чтобы фото загружалось из процессора, на данный момент у меня все работает просто PHP скриптом. Начитался, что можно подвязать FileAttach для загрузки с фронта, но вот как не совсем пойму…
3. И дополнительно к предыдущему пункту — как сделать, чтобы одновременно с закачкой файла, происходила запись пути к нему в поле моей таблицы?
Андрей
11 января 2017, 19:15
modx.pro
1
2 639
+1

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

Fi1osof
12 января 2017, 03:31
+1
Сорри, не готов дать подробный ответ на все эти вопросы, но может быть вам эта статья поможет: modxclub.ru/topics/vse-chto-vyi-xoteli-znat-o-proczessorax-no-boyalis-sprosit-1563.html
    Андрей
    12 января 2017, 08:47
    0
    Николай, спасибо. Отличная статья. Буду разбираться. Но не откажусь и от помощи дополнительной))
      Fi1osof
      12 января 2017, 08:50
      0
      Не за что.

      Ну, сегодня запустим новый публичный канал для общения, спросите, может кто и подскажет что.
        Андрей
        12 января 2017, 08:52
        0
        Хорошо, скинете ссылочку)
          Fi1osof
          12 января 2017, 08:52
          0
          ОК
            Андрей
            12 января 2017, 12:31
            0
            Николай, прочитав статью, вроде стал понимать немного принцип работы с процессорами. но вот есть несколько вопросов. если не затруднит, ответьте коротенько хотя бы):
            1. В моем процессоре есть
            public function beforeSet() {
                    if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                    $this->setProperty('uid', $this->modx->user->id);
                    return true;
                }
            Не совсем понимаю принцип его работы. Что делает этот метод?

            2. Также есть метод process(). Если я правильно понял, в него нужно расписать логику работы. То есть здесь я должен написать код, который загрузит фото мне на сервер и добавит путь к изображению в поле таблицы?

            3. Или мне проще вызвать в своем сниппете другой процессор (к примеру класс upload от компонента FileAttach)? передав ему нужные параметры (ctx, docid, file)? как требуется в этом посте для загрузки фото с фронта.
              Fi1osof
              12 января 2017, 12:39
              0
              Не совсем понимаю принцип его работы. Что делает этот метод?
              Вообще он используется в create/update — процессорах, но здесь он не правильно используется для проверки авторизован пользователь или нет. Как минимум это надо вынести в initialize(), а лучше public
              function checkPermissions() {
                  return $this->modx->user->id && parent::checkPermissions();
              }
              Но checkPermissions не возвращает просто так кастомные сообщения, так что лучше в initialize().

              2. Да.

              3. Я не работал с fileAttach. Но вы можете его внимательней изучить и расширить его же процессор, дополнив собственной логикой. А можете как есть в своем сниппете вызвать.
                Андрей
                12 января 2017, 12:46
                0
                Спасибо за пояснения. А есть какой-то родной процессор для загрузки файлов в MODX?
                  Fi1osof
                  12 января 2017, 12:49
                  0
                  Смотрите папку процессоров MODX-а. В админке же можно файлы загружать, значит конечно же есть joxi.ru/eAOqaVNfx9GZEm
                  Там все через процессоры делается.
                    Андрей
                    12 января 2017, 13:42
                    0
                    А второй процессор вызывается просто дублированием?
                    $response = $modx->runProcessor($processor, $_POST, $processorProps);
                    Или можно сразу передать массив параметров, вместо предыдущей записи написать так:
                    $response = $modx->runProcessor($processor, array(
                        $_POST,
                        $_FILES,
                    ), $processorProps);
                    А уже в моем процессоре манипулировать с ними? У меня почему-то 500 ошибка получается при таких раскладах, если я пытаюсь передать два маасива, то все уходит.
                    print_r($this->getProperties());
                    показывает
                    Array
                    (
                        [0] => Array
                            (
                                [uid] => 3
                                [type] => Физическое лицо
                                [name] => asda
                                [description] => asdad
                                [pageId] => 1
                            )
                    
                        [1] => Array
                            (
                                [photo] => Array
                                    (
                                        [name] => 001.jpg
                                        [type] => image/jpeg
                                        [tmp_name] => /tmp/phpIkrhV6
                                        [error] => 0
                                        [size] => 567169
                                    )
                    
                            )
                    
                    )
                    но с таким кодом получаю 500 ошибку в итоге:
                    Вот код моего класса
                    <?php
                    class ZPSCreateProcessor extends modObjectCreateProcessor {
                        public $classKey = 'ZPS';
                        public $objectType = 'object';
                    
                        public function beforeSet() {
                            if (!$this->modx->user->id) return 'Вам нужно авторизоваться';
                            $this->setProperty('uid', $this->modx->user->id);
                            return true;
                        }
                    	
                    	public function process() {
                    		$path = ('путь к папке для загрузки');
                    	$success = $this->source->uploadObjectsToContainer($path,$_FILES);
                    	
                    }
                    
                    }
                    
                    return 'ZPSCreateProcessor';
                      Fi1osof
                      12 января 2017, 15:04
                      +1
                      Для объединения массивов есть функция array_merge(). $response = $modx->runProcessor($processor, array_merge(
                      $_POST,
                      $_FILES,
                      ), $processorProps)
                      Но $_FILES обычно не передают, с ним как есть работают.
                      Андрей
                      12 января 2017, 15:54
                      0
                      Но $_FILES обычно не передают, с ним как есть работают.
                      В смысле не передают? Или вы имели ввиду не объединяют?
                      Fi1osof
                      12 января 2017, 16:03
                      0
                      Не передают в процессор параметрами. Внутри процессора напрямую с $_FILES работают.
                      Андрей
                      12 января 2017, 16:08
                      0
                      ааа, спасибо.
                      А по этому моему вопросу подскажите пожалуйста)
                      А второй процессор вызывается просто дублированием?
                      Fi1osof
                      12 января 2017, 16:15
                      0
                      Андрей, я и так уже много подсказал. В сети полно информации, изучайте.
                      Андрей
                      12 января 2017, 18:03
                      0
                      Пытаюсь, но такие мелочи вгоняют меня в ступор)
                      Fi1osof
                      12 января 2017, 18:16
                      0
                      Мелочей всегда будет полно. И чем больше вы будете искать самостоятельно, тем лучше потом будете понимать. Нельзя на каждую мелочь вопросы задавать.
          Fi1osof
          13 января 2017, 02:00
          0
          Хорошо, скинете ссылочку)
          modxclub.ru/
            Андрей
            13 января 2017, 09:56
            0
            Спасибо!
              Fi1osof
              13 января 2017, 14:04
              0
              Не за что!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    20