Иван Бондаренко

Иван Бондаренко

Был в сети 24 октября 2024, 17:33
Заказы не принимаю
Василий, подскажи пожалуйста. Уже не знаю, куда копать. Никак не могу получить файл-картинку, отправленную с фронтенда. Целый день сегодня ковыряюсь.

Vesp-core версия 2
Так прописываю маршрут к контроллеру в index.php:

$app->any('/api/user/profilepicture', [App\Controllers\User\Profilepicture::class, '__invoke']);
Вот сам контроллер. Подключал в него все, что нашел
<?php

namespace App\Controllers\User;

use App\Models\User;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\RequestInterface;
use Vesp\Controllers\Controller;
use Psr\Http\Message\UploadedFileInterface;

use Slim\Psr7\UploadedFile;
use Slim\Psr7\Request;

class Profilepicture extends Controller
{
	
    public function patch()
    {
        
		$files = $this->request->getUploadedFiles();
				
		return $this->success($files);
    }
}
Форма отправляется вот так:

const fd = new FormData();
              fd.append("firstName", "John");
              fd.append('file', this.form.file, this.form.file.name);
              console.log(this.form); //тут вижу в консоли, что файл привязался file: File
              
               const {data: user} = await this.$axios.patch('user/profilepicture', fd, 
              { headers: {'Content-Type': 'multipart/form-data' },
                onUploadProgress: function(progressEvent) {
                  var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total)
                  console.log(percentCompleted)
                }
              });
Процент загрузки картинки отрабатывает и когда загружаю большое изображение, процесс идет.

Но $files = $this->request->getUploadedFiles(); возвращает пустой массив. $this->request->getServerParams(); при этом отрабатывает корректно. Я вижу в ответе, что запрос не пустой

"CONTENT_LENGTH": "8579020", // Вот картинка
    "CONTENT_TYPE": "multipart/form-data; boundary=----WebKitFormBoundary640lESYKvPBsYyvc",
    "REQUEST_METHOD": "PATCH",
Где-то я туплю, но где, понять не могу.

Дай совет, что не так. Если есть рабочий пример с реализацией подобного функционала, кинь ссылку сюда или в VESP чат если не сложно. Буду благодарен.
Доставка цветов в Москве, Заказать цветы в Москве, купить 101 розу в Москве и тд — это далеко не ВЧ запросы)
Вы заблуждаетесь. Это основные запросы по вашей нише. И все ваши конкуренты хотят быть первыми именно по этим запросам. Для вашей ниши именно они и есть ВЧ. И конкуренции там более чем достаточно.

Самое простое, что можно внедрить прямо сейчас за пару дней, и что очень поможет:

  • Поисковики любят текст. Добавьте больше уникального текста к каждому товару. Сейчас у вас все товары практически как один. Разница всего пара слов.
  • Если имел место перенос с другого домена, проверьте правильность переадресаций.
Долгосрочно:
  • Начните делать красивые фото ваших букетов. И размещайте их в каталоге. Тут надо подумать, как это лучше реализовать, но в любом случае это сделает магазин более «живым» что-ли...
А вообще тематика достаточно конкурентна. Тут не просто выйти на первые позиции. Нужно много знаний и времени.
Василий, привет! Спасибо за Vesp Core, реально интересно. Помоги советом, пожалуйста. Пытаюсь самостоятельно сделать функционал логина по токенам и зашел в тупик.

Прописал путь для АПИ security/login и user/profile в файле index.php
Соответственно добавил контроллеры в папку Controllers.
Установил модуль авторизации auth. Прописал пути в конгфиге

auth: {
    redirect: {
      home: '/',
      login: '/admin/',
      logout: '/',
    },
    resetOnError: true,
    strategies: {
      local: {
        endpoints: {
          login: {url: 'security/login', method: 'post', propertyName: 'token'},
          logout: {url: 'security/logout', method: 'post'},
          user: {url: 'user/profile', method: 'get', propertyName: 'user'},
        },
      },
    },
  },

При отправке формы отрабатывает security/login, токен добавляется в базу. Но затем user/profile возвращает ошибку
GET http://dev.website.com/api/user/profile 401 (Unauthorized)

Что только я не пробовал. Не получается победить. Вот содержание файла Profile.php.

<?php

namespace App\Controllers\User;

use Psr\Http\Message\ResponseInterface;
use Vesp\Controllers\Controller;

class Profile extends Controller
{
    /**
     * @return ResponseInterface
     */
    public function get()
    {
        if ($this->user) {
            $data = $this->user->toArray();
            $data += ['scope' => $this->user->role->scope];

            return $this->success(['user' => $data]);
        }

        return $this->failure('Authentication required', 401);
    }

    /**
     * @return ResponseInterface
     */
    public function patch()
    {
        if ($password = trim($this->getProperty('password'))) {
            $this->user->password = $password;
        }
        $this->user->save();

        return $this->get();
    }
}
Можешь подсказать, в чем ошибка? Если что, бекенд сайта лежит на работающем сервере. Фронтенд на моем компе.
Вот сегодня как раз поставил SMF на сайт к MODx. Установил SMF 2.0 в папку forums/ и пакет SMF

Тоже при регистрации (или логине) на сайте, на форуме изменений не происходит.
Зато все хорошо работает в обратном направлении. Пользователь логинится на форуме — автоматом логинится и на сайте. Сделайте основной точкой регистрации и входа форум и все будет нормально без изменения в коде.

В списке пользователей на форуме есть только один администратор, хотя у сайта пользователей масса. Ну и при регистрации нового пользователя на сайте он не появляется на форуме.
Пользователи при установке и у меня не импортировались. Для импорта пройдитесь по списку пользователей в админке MODx и обновите их. Просто откройте пользователей по очереди и сохраните каждого. Форум их подхватит.

У меня мало юзеров, поэтому не стал писать никаких сниппетов для этого. Если юзеров много, придется обновлять через процессоры.
Проблема решена. Ошибка была на стороне MODX.com. У них не отрабатывали правильные редиректы на установщик последней версии.
Я связался с поддержкой и они устранили проблему. Теперь все работает правильно.
Регулярно создаю товары в MS2 с пустой ценой. Все сохраняется отлично. Поэтому лучше найдите почему у вас такое непонятное поведение на сайте и исправьте косяк там.

И вообще, если уж ссылаетесь на ошибку в логе, то прикладывайте сам текст ошибки. Тут нет экстрасенсов.
Да. Имею в виду это. Просто сам недавно писал отзыв на своем сайте из фронта. Написал слов 200 а потом полез на другие вкладки в браузере за дополнительной информацией. Чуть случайно не закрыл окно, где печатал :) Понимаю, что такой функционал не в приоритете, но будет плюсом к юзабилити.
Здравствуйте Алексей. Начал пользоваться вашим компонентом для одного из сайтов. Предложение по функционалу: сделайте так, чтобы обзор сохранялся в сессию или куда нибудь еще пока он не опубликован. Своеобразный черновик. Все таки пользователи часто пишут отзывы прямо на сайте и весь труд пользователя может быть легко потерян без таких черновиков. Это плюс к юзабилити сайта.
Алексей, здравствуйте! Классный компонент. Просьба по функционалу: добавьте пожалуйста возможность проголосовать за отзыв. Чтобы потом у каждого отзыва можно было вывести его полезность: «10 пользователей считают этот отзыв полезным». Сейчас такой функционал встречается на многих сайтах-отзовиках.
Как поисковику сказать что у тебя есть страница с AMP
Ответ на вопрос: добавить на основную страницу (в head) следующий метатег со ссылкой на АМП версию:

<link rel="amphtml" href="https://sitename.com/page.html?amp">

в свою очередь, на АМП странице обязательно должен быть тег canonical, указывающий на основную версию страницы.

<link rel="canonical" href="https://sitename.com/page.html" />

Это поможет поисковику понять, где что и не посчитать страницы дублями.
Ну тогда видимо будет проще всего создать свое поле (Тв или Опцию товара) и в нее вбивать вес в том формате, который нужен.
Можно попробовать также через javascript убирать точку и нули при загрузке страницы. Тут уже смотреть надо, что удобнее будет.