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

Дополнение: FileAttach

Здравствуйте.
Сделал форму, которая отправляет данные в отдельную таблицу БД. Форма работает с помощью 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 january 2017, 22:15    Андрей   
1    117 +1

Comments (20)

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

        Ну, сегодня запустим новый публичный канал для общения, спросите, может кто и подскажет что.
        1. Андрей 12 january 2017, 08:52 # 0
          Хорошо, скинете ссылочку)
          1. Николай Ланец 12 january 2017, 08:52 # 0
            ОК
            1. Андрей 12 january 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)? как требуется в этом посте для загрузки фото с фронта.
              1. Николай Ланец 12 january 2017, 12:39 # 0
                Не совсем понимаю принцип его работы. Что делает этот метод?
                Вообще он используется в create/update — процессорах, но здесь он не правильно используется для проверки авторизован пользователь или нет. Как минимум это надо вынести в initialize(), а лучше public
                function checkPermissions() {
                    return $this->modx->user->id && parent::checkPermissions();
                }
                Но checkPermissions не возвращает просто так кастомные сообщения, так что лучше в initialize().

                2. Да.

                3. Я не работал с fileAttach. Но вы можете его внимательней изучить и расширить его же процессор, дополнив собственной логикой. А можете как есть в своем сниппете вызвать.
                1. Андрей 12 january 2017, 12:46 # 0
                  Спасибо за пояснения. А есть какой-то родной процессор для загрузки файлов в MODX?
                  1. Николай Ланец 12 january 2017, 12:49 # 0
                    Смотрите папку процессоров MODX-а. В админке же можно файлы загружать, значит конечно же есть joxi.ru/eAOqaVNfx9GZEm
                    Там все через процессоры делается.
                    1. Андрей 12 january 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';
                      1. Николай Ланец 12 january 2017, 15:04 # +1
                        Для объединения массивов есть функция array_merge(). $response = $modx->runProcessor($processor, array_merge(
                        $_POST,
                        $_FILES,
                        ), $processorProps)
                        Но $_FILES обычно не передают, с ним как есть работают.
                        1. Андрей 12 january 2017, 15:54 # 0
                          Но $_FILES обычно не передают, с ним как есть работают.
                          В смысле не передают? Или вы имели ввиду не объединяют?
                          1. Николай Ланец 12 january 2017, 16:03 # 0
                            Не передают в процессор параметрами. Внутри процессора напрямую с $_FILES работают.
                            1. Андрей 12 january 2017, 16:08 # 0
                              ааа, спасибо.
                              А по этому моему вопросу подскажите пожалуйста)
                              А второй процессор вызывается просто дублированием?
                              1. Николай Ланец 12 january 2017, 16:15 # 0
                                Андрей, я и так уже много подсказал. В сети полно информации, изучайте.
                                1. Андрей 12 january 2017, 18:03 # 0
                                  Пытаюсь, но такие мелочи вгоняют меня в ступор)
                                  1. Николай Ланец 12 january 2017, 18:16 # 0
                                    Мелочей всегда будет полно. И чем больше вы будете искать самостоятельно, тем лучше потом будете понимать. Нельзя на каждую мелочь вопросы задавать.
                          2. Николай Ланец 13 january 2017, 02:00 # 0
                            Хорошо, скинете ссылочку)
                            modxclub.ru/
                            1. Андрей 13 january 2017, 09:56 # 0
                              Спасибо!
                              1. Николай Ланец 13 january 2017, 14:04 # 0
                                Не за что!
                    You need to login to create comments.