Не загружается файл через хук formit2file

Здравствуйте.
Форма уходит, ошибок нет, файл загружается в нужную папку.
А в админке, при открытии ресурса в ТВ отображается вот это: 1608.jpg||image/jpeg||/tmp/php0FgC5A||0||882402

В самой форме вот так:
[[!FormIt?
   &hooks=`formit2resource,formit2file,spam,email,redirect`
   &emailTo=`anton@maxmg.com`
   &redirectTo=`1`
]]

<form action="[[~[[*id]]]]" method="post" class="form-horizontal" enctype="multipart/form-data">
<input id="afb1" type="file" maxlength="100000" name="afb_1" value="[[!+fi.afb_1]]">
<button type="submit" class="btn btn-default">Отправить</button>
</form>
В логах все чисто.

Что я делаю не так?

Спасибо и с праздниками!

<?php
// initialize output;
$output = true;
$counter = 1;
  
// valid extensions
$ext_array = array('jpg', 'png', 'JPG');
$mydir = $hook->getValue('resource_id'); // Path from root that user specifies
  
// create unique path for this form submission
$uploadpath = 'assets/user_images/'.$mydir.'/';
  
// get full path to unique folder
$target_path = $modx->config['base_path'] . $uploadpath;
  
// get uploaded file names:
$submittedfiles = array_keys($_FILES);
 
 
 
// loop through files
foreach ($submittedfiles as $sf) {
  
    // Get Filename and make sure its good.
    $filename = basename( $_FILES[$sf]['name'] );
  
    // Get file's extension
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $ext = mb_strtolower($ext); // case insensitive
  
    // is the file name empty (no file uploaded)
    if($filename != '') {
          
        // is this the right type of file?
        if(in_array($ext, $ext_array)) {
      
            // clean up file name and make unique
            $filename = $counter . '.' . $ext; 
            $filename = str_replace(' ', '_', $filename); // spaces to underscores
            $filename = date("Y-m-d_G-i-s_") . $filename; // add date & time
              
            // full path to new file
            $myTarget = $target_path . $filename;
              
            // create directory to move file into if it doesn't exist
            mkdir($target_path, 0755, true);
              
            // is the file moved to the proper folder successfully?
            if(move_uploaded_file($_FILES[$sf]['tmp_name'], $myTarget)) {
                // set a new placeholder with the new full path (if you need it in subsequent hooks)
                $myFile = $uploadpath . $filename;
                $hook->setValue($sf,$myFile);
                $hook->setValue('myfile',$myFile);
                // set the permissions on the file
                if (!chmod($myTarget, 0644)) { /*some debug function*/ }
                  
            } else {
                // File not uploaded
                $errorMsg = 'There was a problem uploading the file.';
                $hook->addError($sf, $errorMsg);
                $output = false; // generate submission error
            }
          
        } else {
            // File type not allowed
            $errorMsg = 'Type of file not allowed.';
            $hook->addError($sf, $errorMsg);
            $output = false; // generate submission error
        }
      
    // if no file, don't error, but return blank
    } else {
        $hook->setValue($sf, '');
    }
$counter = $counter + 1;
}
return $output;
Решение здесь.
Anton
04 января 2017, 22:37
modx.pro
1
1 357
0

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

Anton
05 января 2017, 23:17
0
Наверное здесь нет таких специалистов, способных решить такую задачу?
    Максим Кузнецов
    05 января 2017, 23:48
    +1
    Куда уж нам..)

    Попробуй дебажить через
    $modx->log(xPDO::LOG_LEVEL_ERROR, cюда вставлять переменную);
    — проверь значения $myFile и $myTarget. Если с ними все ок, проблема с функцией $hook->setValue.
      Anton
      06 января 2017, 00:46
      0
      Задебажил, логи зачекал — пусто :)

      Не знаю как это сделать, поэтому обращаюсь за помощью. Помогите, пожалуйста.

      Но вообще, есть мысль, что это проблема хостера. Хостер GoDaddy. А у Боба Рэя видел часто посты, что у GoDaddy постоянные проблемы с MODX Revo.

      Все же, как узнать проблему? Посоветуйте, пожалуйста.
        Максим Кузнецов
        06 января 2017, 01:51
        0
        Т.е. вы вставили строчки:
        $modx->log(xPDO::LOG_LEVEL_ERROR, $myFile);
        $modx->log(xPDO::LOG_LEVEL_ERROR, $myTarget);
        в вышеописанный код ПОСЛЕ определения этих переменных, попробовали создать новую страницу с прикрепленной картинкой, и оба раза вам вернулось пустое значение?

        Выглядит как ваш случай — forums.modx.com/thread/47603/solved-file-upload-with-formit?page=3#dis-post-458859

          Anton
          06 января 2017, 16:16
          0
          Да, такой же случай.
          Вот такую ошибку показывает:
          [2017-01-06 13:14:15] (ERROR @ /home/public_html/test_site/core/model/phpthumb/modphpthumb.class.php : 117) phpThumb was unable to generate a thumbnail for: /home/public_html/test_site/core/cache/phpthumb/test_site.com__srce655fcb646c6282903f19fa239536122_par0ba78bb0326502335f8683fdf331013a_dat0.jpeg
          [2017-01-06 13:14:15] (ERROR @ /home/public_html/test_site/core/model/phpthumb/modphpthumb.class.php : 129) Error outputting thumbnail:
          OutputThumbnail() failed because !is_resource($this->gdimg_output) in file "phpthumb.class.php" on line 572
          [2017-01-06 13:14:15] (ERROR @ /home/public_html/test_site/core/model/phpthumb/modphpthumb.class.php : 117) phpThumb was unable to generate a thumbnail for: /home/public_html/test_site/core/cache/phpthumb/test_site.com__srce655fcb646c6282903f19fa239536122_par0ba78bb0326502335f8683fdf331013a_dat0.jpeg
          [2017-01-06 13:14:15] (ERROR @ /home/public_html/test_site/core/model/phpthumb/modphpthumb.class.php : 129) Error outputting thumbnail:
          OutputThumbnail() failed because !is_resource($this->gdimg_output) in file "phpthumb.class.php" on line 572
            Максим Кузнецов
            06 января 2017, 16:59
            0
            Вообще, выглядит так, будто проблема с самим formit2resource/2file.
            На вашем месте, я бы подошел к вопросу с другой стороны: я так понимаю, что formit2resource — модуль для создания страниц с админки + рассылка?

            Может, проще создавать страницы через ticketForm + совершать рассылку плагином? В ticketForm уже по-умолчанию есть удобная форма для загрузки изображений, но если она не подходит — всегда можно решить задачу через плагин или платные аналоги загрузчиков.
              Anton
              06 января 2017, 17:14
              0
              Да, добавление новости с фронт-энда с помощью FormIt в коллекцию (Collection). Рассылок нет.
              Все в порядке, все поля заполняются, только поле с файлом (фото) неправильно закачивается.

              То есть formit2resource работает исправно, а formit2file не работает. Дней 5 уже отвлекаюсь на это, сниппетов 7 разных перепробовал — никакие не добавляют файл корректно. То есть, все закачивают, но в самом ТВ (тип Изображение) вот такое содержимое 1608.jpg||image/jpeg||/tmp/php0FgC5A||0||882402

              Что делать?
                Максим Кузнецов
                06 января 2017, 17:35
                +1
                Ну, если нужно быстрое решение и нет желания копаться в 2file, то предлагаю решить вопрос плагином:

                <?php
                	if ($modx->event->name == 'OnDocFormSave' && $mode == 'new') {
                		$template = $resource->get('template');
                		
                		if ($template == айди_нужного_шаблона_ресурсов_которые_создаются) {
                			$image = $resource->getTVValue('название_тв_поле_куда_сохраняется_картинка');
                			
                			if (strlen($image) > 0 ) {
                				list($image,) = explode('|', $image);
                				
                				//на этом месте мы получаем простое название файла (123.jpg)
                				
                				$image = '/прописываем_полный_путь_до_папки_с_картинками/' . $image;
                				
                				$resource->setTVValue('название_тв_поле_куда_сохраняется_картинка', $image);
                				
                			}
                			
                		}
                	
                		
                		$resource->save();
                	}

                + включить на событие OnDocFormSave и добавить ограничивающих условий по вкусу.
                  Anton
                  06 января 2017, 18:55
                  0
                  Получается нагружаем сайт при создании любого ресурса?
                    Максим Кузнецов
                    06 января 2017, 19:04
                    0
                    Не особо. Ну, точнее, нагружаем, но, во-первых, только подходящие по критерию ресурсы (свежесозданные документы, у которых есть картинка и которые подходят по типу шаблона), а во-вторых, на крайне незначительные значения (можете замерить, думаю, на хорошем хостинге будет что-нибудь в пределах 0.1 секунд).

                    Как альтернатива, можете на то же событие и с теми же условиями самолично перехватывать через POST значение нужной формы с картинкой, грузить ее и записывать путь в тв-поле.
                  Anton
                  07 января 2017, 00:16
                  0
                  Кстати, не работает тоже этот способ.
                  В самой форме сделал так:
      Дмитрий Иванов
      05 января 2017, 23:53
      0
      Здесь в основном рецепты еды обсуждают, а у вас что-то сложное.
        Anton
        06 января 2017, 00:49
        0
        Положите 300 грамм сниппетов, 170 грамм плагинов, украсьте чанками? :)
      Anton
      08 января 2017, 19:42
      0
      Прошу помощи, пожалуйста.
      Нашел здесь аналогичную проблему у иностранца. Так все рванулись ему помогать :)

      Я уже недели 1,5 каждый день ищу решение этой проблемы.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        15