Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将dataobject中的上载文件夹设置为相关页面的标题-Silverstripe 3.1_Php_Silverstripe - Fatal编程技术网

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?使用普通的gridfield
new 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);
}