1

嗨,我有一个画廊页面。此图库页面有一个具有 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

图库页面:http ://www.sspaste.com/paste/show/5267dee4c9752

GalleryObject:http ://www.sspaste.com/paste/show/5267df0af1a65

4

2 回答 2

3

你几乎在那里..

这是您编辑的getGalleryTitle()功能。

它基本上是GalleryObject通过 . 检查是否有父画廊$this->GalleryID。由于它是一个has_one关系,该列将被命名GalleryID

然后我们用 获取 Gallery 对象$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->$uploadFolderin setFolderName,由于同样的原因,这不起作用,而且,$uploadFolder由于此变量是在另一个函数的范围内创建的,因此单独使用也不起作用。所以我们只需调用我们在 Object 上定义的函数,$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';
      }
  }
于 2013-10-23T20:49:01.910 回答
0

首先,我检查一下我们是在页面上CMSSettingsPage还是在ModelAdmin页面中(你应该使用它们)。您希望获取有关控制器管理哪个类的所有信息,因为它是数据记录。(如果您有萤火虫,FB($this)getCMSFields()相关DataObject(DO)上将显示您管理的页面DataRecord

Controller::curr()->currentPage()将为您获取正在管理 DO 的当前页面,->URLSegment并将获取页面 url 名称,尽管您可以使用Titleor 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);
}
于 2014-06-24T08:33:00.227 回答