Как правильно использовать behavior?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Как правильно использовать behavior?

Сообщение Onotole »

Код: Выделить всё

foreach ($user_certification as $key => $model) {
    if ($model[$i]->load(Yii::$app->request->post('User')[$key], '') && $model[$i]->validate()) {
        $model[$i]->upload = User::getInstance($model[$i], '['.$i.']upload');
        $model[$i]->save();
     } 
     $i++;
}
 
Это что за конструкция такая? =))
frmaxm
Сообщения: 193
Зарегистрирован: 2015.03.12, 22:16

Re: Как правильно использовать behavior?

Сообщение frmaxm »

делаю в фориче %) подзамучил он меня ---

постоянно Getting unknown property: app\models\User::[1]upload

Код: Выделить всё

$model[$key]->upload = \yiidreamteam\upload\ImageUploadBehavior::getInstance($model[$key], '['.$key.']upload');
Может надо getInstance делать не в фориче? перед добавлением?
frmaxm
Сообщения: 193
Зарегистрирован: 2015.03.12, 22:16

Re: Как правильно использовать behavior?

Сообщение frmaxm »

Onotole писал(а): Это что за конструкция такая? =))
Да вот наворотил делов)))
getInstance же для бихевера надо делать? или для модели?

\yiidreamteam\upload\ImageUploadBehavior::getInstance => я делаю
frmaxm
Сообщения: 193
Зарегистрирован: 2015.03.12, 22:16

Re: Как правильно использовать behavior?

Сообщение frmaxm »

Что-то и не так и не этак
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как правильно использовать behavior?

Сообщение ElisDN »

У поведения верните обратно 'attribute' => 'upload'.
frmaxm
Сообщения: 193
Зарегистрирован: 2015.03.12, 22:16

Re: Как правильно использовать behavior?

Сообщение frmaxm »

ElisDN писал(а):У поведения верните обратно 'attribute' => 'upload'.
Это вернут а гетинстанс я в том же классе делаю?
У меня почему то постоянно не изстен параметр
Getting unknown property
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Как правильно использовать behavior?

Сообщение BalykhinAS »

Что бы не плодить темы воспользуюсь этой)

Поставил dream-team/yii2-upload, вс работает, но возникает вопрос - если очистить папку с кешем а к примеру в выгрузке для Яндекс маркета есть ссылки на изображения то они окажутся битыми потому как изображений в кеше нет. какие есть варианты для создания превьюшек, в том случае если их еще нет?

Возможно есть какие то более новые библиотеки? Хотелось бы размеры указывать в юрл самого файла, но при этом ограничить размеры что бы не было самопроизвольной нарезки
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как правильно использовать behavior?

Сообщение Nex-Otaku »

Делаю так.

1. Всегда хранится оригинал картинки.

2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.

Но это я делаю без расширений, свой код. Наверняка в расширениях что-то подобное есть.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как правильно использовать behavior?

Сообщение zelenin »

хранится оригинал, режется с помощью imgproxy https://github.com/DarthSim/imgproxy, кэшируется нджинксом.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Как правильно использовать behavior?

Сообщение proctoleha »

Nex-Otaku писал(а): 2018.02.20, 02:15 Делаю так.

1. Всегда хранится оригинал картинки.

2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.

Но это я делаю без расширений, свой код. Наверняка в расширениях что-то подобное есть.
У меня точно такой же алгоритм, тоже свой код, готового решения под данный алгоритм не нашел. Единственное отличие - размеры для картинок прилетают из настроек в админ панели, если картинка в кеше, с таким названием уже есть, но у нее др. размеры, то она перезаписывается.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Как правильно использовать behavior?

Сообщение BalykhinAS »

Nex-Otaku писал(а): 2018.02.20, 02:15 2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.
то есть если очистить кеш, и в адресной строке ввести урл превьюшки, к примеру site.ru/images/cache/products/1.jpg то она откроется?

проблема именно в том что бы открыть картинку по ее адресу даже если удалили кеш. Если поисковик проиндексируют картинки или в выгрузку в тот же Яндекс маркет отправить ссылки на картинки и почистить кеш то картинки не откроются если их не нарезать со стороны сайта.

Интересует нарезка на лету - собственно как я понимаю как минимум надо настроить сервер - если картинки нет то обращаемся как php файлу в который передаем параметры картинки из url, нарезаем ее, сохраняем и тут же отдаем. Есть подобные реализации на yii2 или свой костыль делать под это надо?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как правильно использовать behavior?

Сообщение zelenin »

Wizard писал(а): 2018.02.20, 09:25
Nex-Otaku писал(а): 2018.02.20, 02:15 2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.
то есть если очистить кеш, и в адресной строке ввести урл превьюшки, к примеру site.ru/images/cache/products/1.jpg то она откроется?

проблема именно в том что бы открыть картинку по ее адресу даже если удалили кеш. Если поисковик проиндексируют картинки или в выгрузку в тот же Яндекс маркет отправить ссылки на картинки и почистить кеш то картинки не откроются если их не нарезать со стороны сайта.

Интересует нарезка на лету - собственно как я понимаю как минимум надо настроить сервер - если картинки нет то обращаемся как php файлу в который передаем параметры картинки из url, нарезаем ее, сохраняем и тут же отдаем.
viewtopic.php?p=232605#p232593
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как правильно использовать behavior?

Сообщение zelenin »

Wizard писал(а): 2018.02.20, 09:34 Спасибо! А если апач?
апач умеет проксировать и кэшировать?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Как правильно использовать behavior?

Сообщение BalykhinAS »

попробую, спасибо! если так заморачиваться то это http://nginx.org/ru/docs/http/ngx_http_ ... odule.html не проще будет?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как правильно использовать behavior?

Сообщение zelenin »

Wizard писал(а): 2018.02.20, 09:44 попробую, спасибо! если так заморачиваться то это http://nginx.org/ru/docs/http/ngx_http_ ... odule.html не проще будет?
нужна пересборка нджинкса
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как правильно использовать behavior?

Сообщение Nex-Otaku »

Wizard писал(а): 2018.02.20, 09:25
Nex-Otaku писал(а): 2018.02.20, 02:15 2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.
то есть если очистить кеш, и в адресной строке ввести урл превьюшки, к примеру site.ru/images/cache/products/1.jpg то она откроется?
Не откроется. Просто кеш картинок хранится отдельно от прочих кешей и не сбрасывается. Его незачем сбрасывать.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Как правильно использовать behavior?

Сообщение BalykhinAS »

Nex-Otaku писал(а): 2018.02.20, 10:15
Wizard писал(а): 2018.02.20, 09:25
Nex-Otaku писал(а): 2018.02.20, 02:15 2. Под нужный размер превьюшки, картинка генерируется "на лету" когда она нужна + кешируется для повторного использования.
то есть если очистить кеш, и в адресной строке ввести урл превьюшки, к примеру site.ru/images/cache/products/1.jpg то она откроется?
Не откроется. Просто кеш картинок хранится отдельно от прочих кешей и не сбрасывается. Его незачем сбрасывать.
по истечению времени там могут накопится превьюшки которые не используются.
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как правильно использовать behavior?

Сообщение Nex-Otaku »

Ага. Это не проблема.

Мне нравится предложенный Зелениным вариант. Лишь бы там было достаточно функциональности в преобразованиях картинок. О да, и ещё нужно оптимизировать картинки после масштабирования, иначе просядет рейтинг Google PageSpeed.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Как правильно использовать behavior?

Сообщение proctoleha »

Wizard писал(а): 2018.02.20, 10:33 по истечению времени там могут накопится превьюшки которые не используются.
Продумайте организацию хранения и удаления файлов таким образом, чтобы мусора в вашей системе не было в принципе. Имхо, это самое первое с чего нужно начинать. И, когда, начинаешь двигаться в этом направлении, то понимаешь, что готовых решений нет. Ключевой момент: удалить картинку так, чтобы не осталось мусора в виде превьюх.

Например, у меня алгоритм такой.

1. Есть дерево категорий, например, дерево категорий продуктов. В БД данные хранятся в виде дерева nested sets, в FS в виде плоского списка категорий продуктов по id категории. Например: uploads/products/1, uploads/products/2, ... uploads/products/n, где цифры - это id категории.

2. К каждой категории относятся несколько продуктов, например к категории с id ==1, относятся продукты с id == 1, id == 2, id == 3. Картинки для каждого продукта также хранятся в каталоге с именем == id продукта. На моем примере продукт с id == 1 хранится в каталоге uploads/products/1/1, c id == 2 в uploads/products/1/2 и т.д.

3. Предположим, что у продукта с id == 1 есть несколько картинок и превьюх (большие превью и маленькие с какими-то размерами). Например, есть большая картинка 1.jpg (uploads/products/1/1/1.jpg) и должны быть две превьюхи.
Например:
uploads/products/1/1/small_thumb/1.jpg
и
uploads/products/1/1/large_thumb/1.jpg.

Базовое имя файла не меняется, но это разные файлы, т.к. лежат по разным адресам, и у них разные размеры, сами файлы генерируются "на лету". И превьюхи всегда доступны! Если файла нет, он генерируется.

4. Для удаления я использую fileHelper, он находит все картинки с одинаковыми базовыми именами, и мусора не остается.

Код: Выделить всё

class DeleteImages
{
    public static function deleteImages(string $dir, string $image)
    {
        $webRoot = FileHelper::normalizePath(yii::getAlias('@webroot'));

        if ($images = FileHelper::findFiles($webRoot . $dir, ['only' => [$image]])) {
            foreach ($images as $img) {
                unlink($img);
            }
        }
    }
}
=====================
Я не утверждаю, что это идеальный алгоритм, но тем не менее мусора в виде превьюх у меня нет.
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Ответить