Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

MODX статьи, уроки и готовые решения для MODX Revo

Сайдбар

Загрузка фото пользователем при регистрации на сайте MODX Revolution

17 апр. 2014

Способ загрузки фото пользователя в систему управления контентом MODX Revo при регистрации (не при обновлению профиля), потому что при регистрации, пользователь не имеет еще анкету, в то время как путь к картинке должен быть сохранен в базе данных профиля пользователя.
Еще одно соображение, чтобы использовать этот способ, это то что картинка должна находиться в папке пользователя. Ну, логически все пользователи имеют собственные папки.


В этом примере используется упрощенная форма, вы же можете добавлять поля которые вам необходимы при регистрации пользователей с помощью сниппета Register


Сниппет Register



[[!Register?
&preHooks=`register.preHook`
&postHooks=`register.postHook`
&placeholderPrefix=`reg.`
]]


Загрузка файла



Поле для загрузки фото выглядит так:

<code><form action="[ [~[ [*id]]]]" method="post" enctype="multipart/form-data" >
   <!-- здесь другие поля формы ... -->
   <input type="file" name="photo" >
   <input type="submit" name="login-register-btn " >
</form></code>


Register preHooks



<code><?php
$output = true;
$fields = $hook->getValues();
/* User's photo */
if (!empty($fields['photo'])) {
    // valid extensions
    $extArray = array('jpg', 'jpeg', 'gif', 'png');
    // create temporary path for this form submission
    $uploadPath = 'assets/uploads/temp/';
    $targetPath = $hook->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);
        
        // case insensitive
        $ext = mb_strtolower($ext);
        
        // is the file name empty (no file uploaded)
        if ($filename != '') {
            // is this the right type of file?
            if (in_array($ext, $extArray)) {
                //create file called the user name
                $filename = mb_strtolower($filename);
                // full path to new file
                $uploadFilePath = $targetPath . $filename;
                // create directory to move file into if it doesn't exist
                @mkdir($targetPath, 0755, true);
                if (file_exists($uploadFilePath)) {
                    // Change the file permissions if allowed
                    chmod($uploadFilePath, 0755);
                    // remove the file
                    unlink($uploadFilePath);
                }
                // is the file moved to the proper folder successfully?
                if (move_uploaded_file($_FILES[$sf]['tmp_name'], $uploadFilePath)) {
                    $hook->setValue($sf, $uploadPath . $filename);
                    if (!chmod($uploadFilePath, 0644)) {
                        /* some debug function */
                    }
                } else {
                    
                    // File not uploaded
                    $errorMsg = 'There was a problem uploading the file.';
                    $hook->addError($sf, $errorMsg);
                    
                    // generate submission error
                    $output = false; 
                }
            } else {
                
                // File type not allowed
                $errorMsg = 'Type of file not allowed.';
                $hook->addError($sf, $errorMsg);
                
                // generate submission error
                $output = false;
            }
        } else {
            
            // if no file, don't give error, but just return blank
            $hook->setValue($sf, '');
        }
    }
}
return $output;</code>


Register postHooks


Это самая важная часть, где картина вот-вот будет переехала в новый личной папке пользователя, и мы также собираемся обновить профиль пользователя после этого.

<code><?php
/** @var modUser $user */
$user = & $fields['register.user'];
$userId = $user->get('id');
/** @var modUserProfile $profile  */
$profile = & $fields['register.profile'];
if (!empty($fields['photo'])) {
    $photo = array();
    $photo['temp'] = $fields['photo'];
    $photo['basename'] = basename($photo['temp']);
    /***********************************************************************
     * XXX: IMPORTANT XXX
     *
     * Create unique path here for this profile updating.
     * You can change this as you wish.
     * The $userId variable comes from above initiation.
     *
     ***********************************************************************/
    $photo['newdir'] = 'assets/uploads/profiles/' . $userId . '/';
    $photo['newfilepath'] = $photo['newdir'] . $photo['basename'];
    $photo['target'] = $hook->modx->config['base_path'] . $photo['temp'];
    $photo['moved'] = $hook->modx->config['base_path'] . $photo['newfilepath'];
    // make the user's private directory
    mkdir($photo['newdir'], 0755, true);
    $photoUpdated = false;
    // move the photo from the temporary path to the new one
    if (!rename($photo['target'], $photo['moved'])) {
        // if "rename" function fails, try "copy" instead.
        if (!copy($photo['target'], $photo['moved'])) {
            // just dump the log report to the MODX's error log,
            // because both "rename" and "copy" functions fail
            $hook->modx->log(modX::LOG_LEVEL_ERROR, __FILE__ . ' ');
            $hook->modx->log(modX::LOG_LEVEL_ERROR, __LINE__ . ': $userId ' . $userId);
            $hook->modx->log(modX::LOG_LEVEL_ERROR, __LINE__ . ': $photo ' . print_r($photo, 1));
        } else {
            // if copy succeeded, delete the old temporary picture
            unlink($photo['target']);
            $photoUpdated = true;
        }
    } else {
        $photoUpdated = true;
    }
    if ($photoUpdated) {
        /**
        * Теперь мы обновляем профиля
         * Переменная $ профиль приходит сверху посвящения.
         */
        $profile->set('photo', $photo['newfilepath']);
        $profile->save();
        /**
         * Yeah! xPDO rocks! Simply like that!
         */
    }
}
return TRUE;
</code>

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


Никакого спама, только обновления!!!

Комментарии (1)

  1. Дмитрий 28 марта 2016, 20:17 # 0
    Здравствуйте! У меня загружается фото при регистрации, а заменить я его не могу, после замены путь прописывается от корня сайта: имясайта/123.img, где, конечно, ничего нету… но ничего не появляется и в папке assets/uploads/profiles/ Куда копать, подскажите?

    Услуги по MODX Revolution

    Посмотреть все услуги

    Техническая оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать