2013-10-23 2 views
1

안녕하세요 갤러리 페이지가 있습니다. 이 갤러리 페이지갤러리 이미지 객체과 has_many 관계를 가지고 있습니다.데이터 객체의 업로드 폴더를 관련 페이지의 제목으로 설정 - Silverstripe 3.1

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"로 설정되었습니다.

누군가가 내게 어떻게 알 수 있습니까? o 제목을 되 찾을 수 있도록 $ 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

'GalleryPage', 'GalleryImages'및 'Gallery()'에서 'Gallery()'의 출처를 모르면 코드를 사용하여 클래스를 게시 할 수 있습니까? 클래스와 관계 정의로 코드를 게시 할 수 있다면 적절한 코드를 제공 할 수 있습니다. – colymba

+0

물론, 내가 질문을 편집 – invictus

답변

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은 충분하다.

당신은 setFolderName에서 $this->$uploadFolder를 호출했다

이이 변수가 다른 함수의 범위에서 생성 된 이후에 작동하지 않을 것 자체 $uploadFolder를 사용하여도 같은 이유로 작동하지 않습니다. 그래서 우리는 Object에 정의한 함수를 $this->getGalleryTitle()이라고 부릅니다. 원하는 값을 반환하기 때문입니다.

괜찮 으면 좋겠지 만 갤러리 제목이 변경되면 폴더 이름도 바뀌므로 유의하십시오. 그래서 당신은 같은 갤러리에 대한 여러 다른 폴더에 업로드 된 이미지로 끝날 수도 있습니다 ... 당신이 일종의 "제목 잠금 시스템"또는 "올바른"또는 첫 번째 "유지하는 몇 가지 방법을 구현하지 않는 한 나는 개인적으로 조언하지 않을 것이다. 편집 할 수없는 별도의 개체 속성에있는 "유효/허용됨"갤러리 제목을 폴더 이름에 사용하십시오.

대개이 경우 ($ gallery-> ID) ID 만 사용합니다. 변경되지 않으므로

편집

GalleryObject 아직 저장되지 않은 경우에도 작동합니다 getGalleryTitle()의 또 다른 버전.

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'; 
     } 
    } 
+0

아, 이것이 왜 작동하지 않는지 설명합니다. 이 설명에 감사드립니다. 갤러리 제목을 사용하는 당신의 권리는 그리 똑똑하지 않습니다. 대신 ID를 사용하겠습니다. 하지만 함수는 항상 기본값을 반환하고 if 문없이 사용하면 아무 것도 반환되지 않습니다 (ID를 사용하는 경우 각 갤러리에 대해 0). 어딘가에 실수가 있지만, 나는 그것을 발견 할 수 없다. – invictus

+0

GalleryObject가 GalleryPage (GalleryID = 0)에 추가되지 않으면 기본값을 반환합니다. GalleryObject를 어떻게 만듭니 까? ModelAdmin을 통해? 또는 GridFieldRealtionEditor? – colymba

+0

에있는 getCMSFields 함수에서 일반적인 gridfield 인'new GridField ('GalleryImages', _t ('Dict.GALLERY_IMAGES', '갤러리 이미지'), $ this-> GalleryImages(), CreateSortableGrid :: create()); GallyerPage. 내 질문에 첨부 된 링크를보고 싶다면. 당신은 전체 코드를 볼 수 있습니다 – invictus

0

첫째, (당신이 그들을 사용되어야 함) 우리가 CMSSettingsPageModelAdmin 페이지에있어 여부를 확인합니다. 컨트롤러가 관리하는 클래스에 대한 모든 정보를 데이터 레코드로 가져 오려고합니다.

Controller::curr()->currentPage() (당신이 관련 DataObject (DO에 getCMSFields()에 불을 지르고, FB($this)이있는 경우) 당신에게 DataRecord에서 관리 페이지를 표시합니다) 당신에게 DO가 관리되고있는 현재 페이지를 얻을 것이다, 그리고 ->URLSegment 페이지의 URL을 얻을 것이다 이름을 입력 할 수도 있지만 Title 또는 MenuTitle을 사용할 수도 있습니다. 여기

는 이미지를 저장하는 자산/헤더 아래을 폴더를 설정합니다 예입니다. /자산을 생성하고 폴더에 객체를 저장합니다 HomePage (즉, URL 세그먼트 '집')에 실행/헤더/집.

if (Controller::curr()->class == 'CMSSettingsController' || Controller::curr() instanceof Modeladmin) { 
    $uploadField->setFolderName('Headers'); 
} 
else 
{ 
    $uploadField->setFolderName('Headers/' . Controller::curr()->currentPage()->URLSegment); 
} 
관련 문제