将dataobject中的上传文件夹设置为相关页面的标题 - Silverstripe 3.1

时间:2013-10-23 11:33:02

标签: php silverstripe

嗨,我有一个画廊页面。此图库页面有一个图库图片对象,其中包含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

2 个答案:

答案 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将获取页面网址名称,但您也可以使用TitleMenuTitle

下面是一个示例,它将在 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);
}