嗨,我有一个画廊页面。此图库页面有一个图库图片对象,其中包含has_many关系。
private static $has_many = array(
'GalleryImages' => 'GalleryObject'
);
我的图库对象有一个图片上传字段。我想将上传文件夹设置为图库页面
的标题我尝试了这个没有结果
$visual->setFolderName('Galerie/'.$this->Gallery()->Title);
和这(我更喜欢的)
public function getGalleryTitle() {
$galleryTitle = $this->Gallery()->Title->First();
$uploadFolder = str_replace(' ', '-', $this->$galleryTitle);
return $uploadFolder;
}
$visual->setFolderName('Galerie/'.$this->$uploadFolder);
第二次返回错误(未定义变量uploadFolder?!),我的上传文件夹现在设置为“Galerie / DataList”
有人可以告诉我如何转换$ uploadFolder的输出以便我取回标题吗?
修改
GalleryHolder:http://www.sspaste.com/paste/show/5267dea3579a6
GalleryPage:http://www.sspaste.com/paste/show/5267dee4c9752
GalleryObject:http://www.sspaste.com/paste/show/5267df0af1a65
答案 0 :(得分:3)
你几乎就在那里..
以下是您已编辑的getGalleryTitle()
功能。
基本上通过GalleryObject
检查$this->GalleryID
是否有父图库。由于它是has_one
关系,因此该列将命名为GalleryID
。
然后我们使用$this->Gallery()
获取图库对象,并使用$gallery->Title
获取标题。
我还将您的str_replace
替换为SilverStripe的URLSegmentFilter
课程。这将删除URL中不受欢迎的空格和其他特殊字符,这是一个更好的解决方案。
public function getGalleryTitle()
{
if ( $this->GalleryID )
{
$gallery = $this->Gallery();
$filter = new URLSegmentFilter();
return $filter->filter( $gallery->Title );
}
else{
return 'default';
}
}
然后在getCMSFields()
函数中,在创建UploadField
时,我们只需调用返回文件夹名称字符串的getGalleryTitle()
函数。
$visual = new UploadField('Visual', _t('Dict.IMAGE', 'Image'));
$visual->setFolderName('Galerie/'.$this->getGalleryTitle());
一些笔记..
$this
引用当前的Object实例,因此您无法使用$this->$galleryTitle
来访问刚刚在函数中创建的变量,$galleryTitle
本身就足够了。
您在$this->$uploadFolder
中呼叫setFolderName
,但由于同样的原因,这不起作用,而且,由于此变量是在此处创建的,因此使用$uploadFolder
本身也不起作用另一个功能的范围。所以我们只用$this->getGalleryTitle()
调用我们在Object上定义的函数,因为它返回了我们想要的值。
这应该可以正常工作,但请记住,如果图库的标题在某些时候发生变化,文件夹名称也会改变。所以你最终可能会在同一个画廊的许多不同文件夹中上传图片...我个人不会建议它,除非你实施某种“标题锁定系统”或某种方式来保持“正确”或第一个“有效/可接受的“无法编辑的单独对象属性中的图库标题,并在文件夹名称中使用它。
我通常只会在这种情况下使用ID
($ gallery-> ID),因为这不会改变。
修改强>
getGalleryTitle()
的另一个版本,即使GalleryObject
尚未保存,也应该有效。
public function getGalleryTitle()
{
$parentID = Session::get('CMSMain')['currentPage'];
if ( $parentID )
{
$gallery = Page::get()->byID( $parentID );
$filter = new URLSegmentFilter();
return $filter->filter( $gallery->Title );
}
else{
return 'default';
}
}
答案 1 :(得分:0)
首先,我检查一下我们是在CMSSettingsPage
还是ModelAdmin
页面(你是否应该使用它们)。您希望获得有关控制器管理哪个类的所有信息,因为它是数据记录。 (如果您有萤火虫,相关FB($this)
(DO)的getCMSFields()
DataObject
会显示DataRecord
下管理的页面
Controller::curr()->currentPage()
将为您提供正在管理DO的当前页面,->URLSegment
将获取页面网址名称,但您也可以使用Title
或MenuTitle
下面是一个示例,它将在 assets / Headers 下设置一个文件夹以保存图像。在HomePage
(即URL Segment'home')上运行此文件将创建并保存对象进入文件夹 / assets / Headers / home 。
if (Controller::curr()->class == 'CMSSettingsController' || Controller::curr() instanceof Modeladmin) {
$uploadField->setFolderName('Headers');
}
else
{
$uploadField->setFolderName('Headers/' . Controller::curr()->currentPage()->URLSegment);
}