Php 将dataobject中的上载文件夹设置为相关页面的标题-Silverstripe 3.1
嗨,我有一个图库页面。此图库页面具有一个具有多个关系的图库图像对象Php 将dataobject中的上载文件夹设置为相关页面的标题-Silverstripe 3.1,php,silverstripe,Php,Silverstripe,嗨,我有一个图库页面。此图库页面具有一个具有多个关系的图库图像对象 private static $has_many = array( 'GalleryImages' => 'GalleryObject' ); mygallery对象具有图像上载字段。我想将上传文件夹设置为图库页面的标题 我试过了,没有结果 $visual->setFolderName('Galerie/'.$this->Gallery()->Title); 还有这个(我更喜欢) 第二
private static $has_many = array(
'GalleryImages' => 'GalleryObject'
);
mygallery对象具有图像上载字段。我想将上传文件夹设置为图库页面的标题
我试过了,没有结果
$visual->setFolderName('Galerie/'.$this->Gallery()->Title);
还有这个(我更喜欢)
第二个返回错误(未定义变量uploadFolder?!),我的上传文件夹现在设置为“Galerie/DataList”
有人能告诉我如何转换$uploadFolder的输出,以便我找回标题吗
编辑:
厨房持有人:
GalleryPage:
GalleryObject:你几乎就在那里 这是您编辑的
getGalleryTitle()
函数
它基本上是通过$this->GalleryID
检查GalleryObject
是否有父库。由于它是一个有一个关系,因此该列将被命名为GalleryID
然后我们使用$this->Gallery()
获取Gallery对象,并使用$Gallery->title
获取其标题
我还将您的str\u replace
替换为SilverStripe的urlsectfilter
类。这将删除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
引用当前对象实例,因此不能使用$this->$galleryTitle
访问刚在函数中创建的变量,$galleryTitle
本身就足够了
您在setFolderName
中调用$this->$uploadFolder
,出于同样的原因,这不起作用,而且,单独使用$uploadFolder
也不起作用,因为此变量是在另一个函数的作用域中创建的。因此,我们只需使用$this->getGalleryTitle()
调用我们在对象上定义的函数,因为它返回我们想要的值
这应该可以很好地工作,但请记住,如果库的标题在某个时候发生更改,文件夹名称也会随之更改。因此,您可能最终会将图像上载到同一个库的多个不同文件夹中。。。我个人不会建议这样做,除非您实施某种“标题锁定系统”,或者以某种方式将“正确”或第一个“有效/可接受”的库标题保留在一个单独的对象属性中,该属性不能编辑并在文件夹名中使用
$visual = new UploadField('Visual', _t('Dict.IMAGE', 'Image'));
$visual->setFolderName('Galerie/'.$this->getGalleryTitle());
在这种情况下,我通常只使用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';
}
}
首先,我检查我们是在CMSSettingsPage
还是在ModelAdmin
页面上(您是否应该使用它们)。您希望获得控制器正在管理的类的所有信息,作为其数据记录。(如果您有firebug,DataObject
(DO)上的getCMSFields()
中的FB($this)
将显示在DataRecord
下管理的页面)
Controller::curr()->currentPage()
将为您获取管理DO的当前页面,->URLSegment
将获取页面url名称,不过您也可以使用Title
或MenuTitle
下面是一个示例,它将在资产/标题下设置一个文件夹以保存图像。在主页
(即URL段“home”)上运行此操作将创建对象并将其保存到文件夹/assets/Headers/home中
你能用你的代码发布这些类吗?当你看“GalleryPage”、“GalleryImages”和“Gallery()”的时候,会很困惑,不知道“Gallery()”是从哪里来的。如果你能用类和关系定义发布你的代码,我们就能给你正确的代码。当然,我编辑了问题啊,这解释了为什么它不起作用。谢谢你的解释。你的权利,使用画廊标题不是那么聪明。我会用这个ID来代替。但是该函数总是返回默认值,如果我在不使用if语句的情况下使用它,则不会返回任何内容(如果我使用id,则每个库都返回0)。某个地方有错误,但我无法发现。如果没有将GalleryObject添加到GalleryPage(GalleryID=0),它将返回默认值。如何创建GalleryObjects?通过模型管理员?或者GridFieldRealtionEditor?使用普通的gridfieldnew gridfield('GalleryImages','U t('Dict.GALLERY_IMAGES','GALLERY IMAGES'),$this->GalleryImages(),CreateSortableGrid::create())代码>在Gallyer页面上的my getCMSFields函数中。如果你想看看我问题中的附加链接。在那里,当我测试它时,你可以看到整个代码工作良好。但是,当您创建新GalleryObject时,在保存之前,GalleryObject不存在,因此它没有GalleryID
,因此文件夹是默认文件夹。您可以在if($this->ID)
语句中包装UploadField,这样只有当GalleryObject已保存且具有GalleryID时,才能上载图像。您是对的。我需要先保存它。但在保存之前,是否有其他方法将上载文件夹设置为GalleryPage ID?
if (Controller::curr()->class == 'CMSSettingsController' || Controller::curr() instanceof Modeladmin) {
$uploadField->setFolderName('Headers');
}
else
{
$uploadField->setFolderName('Headers/' . Controller::curr()->currentPage()->URLSegment);
}