我有一个简单的“post”AR类/表。它基于“博客教程”,因此它具有相同的用途。 我希望能够将图像嵌入帖子中。我的设计如下,我对它并不完全满意,所以我很乐意收到您的反馈意见:
设计建议:目录 protected / data / posts_files / {post_id} 将成为帖子“资源”的存储库(在我们的案例中为图片,但可以是任何内容) 。帖子作者需要将使用过的图像/文件放在正确的位置(在创建帖子之后,因为需要它的id)。我的需求非常谦虚,所以从便利的角度来看,这是可以的。当请求包含此类图像的帖子时,将调用CAssetManager以“发布()”该帖子的目录(例如protected / data / posts_files / 17)。 在帖子本身(在他们的“内容”或“正文” - 你喜欢的任何术语)中,图像将嵌入 img 标签,src属性指向此post_id的已发布目录资产文件夹(例如,在发布特定帖子后, WEBROOT / assets / d379e294 / some_image.gif )。
问题是,当创建/编辑帖子时,我不知道CAssetManager将创建和返回的路径 - 看似随机的文本字符串(上例中的 d379e294 )。因此,我需要在运行时,在加载“post”时,在发布后,使用img标记的'src'属性中的正确url / paths(或其他所有类型的资源)实时更新其内容链接在'post')。
这有点挑战性:最初我在'post'内容/正文中使用了一个PHP变量,并尝试在加载时或在渲染帖子之前以某种方式插入它。我没有成功。我使用了PHP的 eval(),这是一种非常糟糕的做法并且本身很危险,而且它一直在抱怨“帖子”体内的其他内容。 我在帖子的主体中使用了一些简单的占位符字符串 - “ ASSETS_URL ”和 str_replace()在使用我发布的资产路径加载帖子时现在“在手边(在运行时)。
我不确定这是最好的方法。在某些帖子中可能需要这个占位符字符串,此外,这似乎是一个基本的模板引擎启动,我的直觉告诉我,如果我在框架内做一个简单的模板引擎,我会遗漏一些东西。我只能指出'正确'的选择,最好的做法选择,在Yii中做到这一点。 我想就此问题征求您的意见 - 无论是从更高层次的设计解决方案还是在实施本身的设计方面。你会改变一些东西并使它们与众不同吗?
(我不想潜入KcFinder所以故意将其排除在外。)
谢谢, 波阿斯。
答案 0 :(得分:1)
请阅读Yii的课程参考,这是一个了不起的工具,可以使用。
http://www.yiiframework.com/doc/api/1.1/CAssetManager#publish-detail
如果使用hashByName可选参数,如果给出与参数同名的文件夹,则assetManager将始终返回相同的URL。但是,如果您尝试使用此参数发布具有相同名称的多个文件/文件夹,则假定文件/文件夹已发布,它将无效,因为它按文件/文件夹名称进行哈希,而不是父目录名称和修改的串联时间。
然后在编辑所述帖子时,只需使用可选的forceCopy重新发布以更新所述文件。
至于回复其他人的帖子
在此使用CAssetManager没有任何正当理由 情况下
我想回应这样一个事实,即模糊目录布局和代码始终是避免被黑客攻击的最佳选择。特别是在像php这样的语言中,其局限性如此众所周知。
此外,它允许您隐藏“上传”文件夹,因为大部分时间它都是权限777或755,具体取决于您的网站主机和设置。这可以让你进一步保护自己。
答案 1 :(得分:0)
我建议在你的应用程序根目录下创建一个目录,比如:root/post_files/{post_id}/
并在那里存储与帖子相关的文件。您可以在db中存储相关post文件的路径,并在需要时使用存储的路径检索文件。
我不是专家,只是我的建议。