2012-03-14 3 views
1

У меня есть простой «пост» AR-класс/таблица. Его основано на «учебнике блога», поэтому оно служит той же цели. Я хочу, чтобы иметь возможность вставлять изображения в сообщения. Мой проект был следующим, и я не был полностью доволен этим, так что я буду рад за Ваш отзыв:Yii framework: лучший способ вставлять изображения в «сообщения»?

Дизайн предложение: Каталог защищены/данные/posts_files/{post_id} будет хранилище сообщения «ресурсы» (изображения в нашем случае, но могут быть любыми). Авторы сообщения должны помещать используемые изображения/файлы в нужное место (после создания сообщения, так как его идентификатор необходим). Мои потребности очень смиренны, поэтому с точки зрения удобства это нормально. Когда запрашивается сообщение с такими изображениями, CAssetManager будет вызван на помощь, чтобы «опубликовать()» каталог этого сообщения (например, protected/data/posts_files/17). В самих сообщениях (в их «содержании» или «телу», которые вы предпочитаете), изображения будут вставляться с тегами img, что атрибут src указывает на опубликованный каталог для этого post_id в папке с ресурсами (для например, после публикации определенной должности, WEBROOT/assets/d379e294/some_image.gif).

Проблема заключается в том, что при создании сообщений/отредактирован, я не знаю, какой путь CAssetManager будет создавать и возвращать - это, казалось бы, случайные строки текста (d379e294 в приведенном выше примере). Таким образом, мне нужно во время выполнения загрузки «post», чтобы обновить его контент в прямом эфире после публикации, с правильными URL-адресами в атрибуте «src» тегов img (или для любого другого вида ресурсов связанных в этой статье).

Это было немного сложно: сначала я отправился с переменной PHP в контент/тело сообщения и попытался каким-то образом интерполировать его при загрузке или непосредственно перед рендерингом сообщения. Мне не удалось. Я использовал PHP eval(), что очень плохая практика и опасно сама по себе, и она продолжала терпеть жалобы на другой контент в теле «пост». Я прибегнул к тому, чтобы в корпусе столбов была простая строчка для места - «ASSETS_URL» и str_replace() это при загрузке сообщения с опубликованным типом активов, который я «сейчас» имею под рукой (во время выполнения) ,

Я не уверен, что это лучший подход. эта строка владельца места может понадобиться в каком-то посте, и, кроме того, это похоже на базовый запуск шаблонов шаблонов, и моя интуиция говорит мне, что я что-то пропускаю, если я делаю простой шаблонный шаблон внутри рамки. Я просто могу указать на «правильную» альтернативу, альтернативу лучшей практики, сделать это в Yii. Я хотел попросить ваше мнение об этом - как по дизайну решения с более высокого уровня, так и по дизайну самой реализации. Не могли бы вы изменить ситуацию и сделать ее другой?

(Я не хотел погружаться в KcFinder, поэтому намеренно оставил его).

Thanks, Boaz.

+0

Imho, кажется, что вся ваша проблема возникает из-за того, что вы используете CAssetManager. Какое преимущество это дает вам? И что именно вы имеете в виду, когда говорите: «Авторам сообщения нужно поместить использованные изображения/файлы в нужное место (после того, как сообщение создано, так как его идентификатор необходим).« Имеют ли авторы сообщения доступ к вашим каталогам? Это приложение внутри компании или что-то еще? –

ответ

0

Imho, кажется, что вся ваша проблема возникает из-за того, что вы используете CAssetManager. Какое преимущество это дает вам?

Я бы предложил создать каталог под корнем вашего приложения, скажем: root/post_files/{post_id}/ и сохранить там связанные файлы. Вы можете хранить пути для связанных файлов сообщений в db и извлекать файл, когда это необходимо, используя этот сохраненный путь.

Я не эксперт, просто мое предложение.

+0

прокомментируйте мое предложение и ответьте на мои вопросы на ваш вопрос. –

+1

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

+0

yup, это правильное использование активов, AFAIK. поэтому мне было интересно, как это поможет в вашем случае. В любом случае, отлично, что вы согласны со мной. –

1

Пожалуйста, прочтите ссылку на класс для Yii, это замечательный инструмент и предназначен для использования.

http://www.yiiframework.com/doc/api/1.1/CAssetManager#publish-detail

Если вы используете hashByName необязательный параметр assetManager будет всегда возвращает тот же URL, если данный папку с тем же именем в качестве параметра. Однако, если вы попытаетесь опубликовать несколько файлов/папок с одинаковыми именами с этим параметром, то он ничего не сделает, полагая, что файл/папка уже опубликован, поскольку он хеширует по имени файла/папки, а не конкатенации имени родительского каталога и модификации время.

Затем после редактирования указанного сообщения вы можете повторно опубликовать с помощью дополнительной forceCopy для обновления указанных файлов.

Как ответить на пост другой говорит

нет реальных оснований для использования CAssetManager в этом случае

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

Также он позволяет вам скрыть папку «uploads», так как большую часть времени это будет с разрешениями 777 или 755 в зависимости от вашего веб-хоста и настройки. Это позволяет вам защитить себя дальше.

Смежные вопросы