Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

Moderators: martimiz, UncleCheese, Sean, biapar, Willr, Ingo, swaiba, simon_w

Adding DOM to ModelAdmin with catagories (Uncle Cheese, Aram??)


Reply


4 Posts   914 Views

Avatar
Hello_electro

Community Member, 80 Posts

9 September 2011 at 12:45pm

Hi Everyone:

I am following the tutorial on Aram's ssbits.org page.

http://www.ssbits.com/tutorials/2010/dataobjects-as-pages-part-2-using-model-admin-and-url-segments-to-create-a-product-catalogue/

I am trying to tweak it so that I can add a ImageDataObjectManager tab to each specific project. I have been fairly successful, but the issue is that when i upload the graphics in the tab and save them, they do the following:

1. sometimes dissapear (maybe a folder permissions issue?)

2. IMPORTANT: the images i saved in the previous project appear in any new project I create after that. IS there a away I can set this up so that the images stay specific to their project? Everything else seems to work fine but this. Any help would be greatly appreciated!

Project.php

<?php

class Project extends DataObject
{
   static $db = array(
      'Title' => 'Varchar(255)',
      'Description' => 'HTMLText',
      'URLSegment' => 'Varchar(255)',
      'MetaTitle' => 'Varchar(255)'
   );

   //Set our defaults
   static $defaults = array(   
      'Title' => 'New Project',
      'URLSegment' => 'new-Project'
   );
   
   static $has_one = array(
   'Image' => 'Image'
   );
   
   //Relate to the category pages
   static $belongs_many_many = array(
      'Categories' => 'CategoryPage'
   );
   
   //Fields to show in ModelAdmin table
   static $summary_fields = array(
      'Title' => 'Title',
      'URLSegment' => 'URLSegment',
   );   

   //Add an SQL index for the URLSegment
   static $indexes = array(
      "URLSegment" => true
   );   

   //Fields to search in ModelAdmin
   static $searchable_fields = array (
      'Title',
      'URLSegment',
      'Description',
      'Categories.ID' => array(
         'title' => 'Category'
      )
   );

   

public function getCMSFields()
{
$f = parent::getCMSFields();
$manager = new ImageDataObjectManager(
$this, // Controller
'Images', // Source name
'ProjectImage', // Source class
'ProjectImageAttachment', // File name on DataObject
array(
'Title' => 'Title',
'Caption' => 'Caption'
), // Headings
'getCMSFields_forPopup' // Detail fields
// Filter clause
// Sort clause
// Join clause
);
      $manager->setUploadFolder('ProjectImages');
$f->addFieldToTab("Root.AdditionalPhotos",$manager);
      $f->addFieldToTab("Root.Main", new TextField('Title', 'Title'));   
      $f->addFieldToTab("Root.Main", new TextField('URLSegment', 'URL Segment'));   
      $f->addFieldToTab("Root.Main", new TextField('MetaTitle', 'Meta Title'));   
      $f->addFieldToTab("Root.Main", new HTMLEditorField('Description'));
      
      //Categories
      $Categories = DataObject::get('CategoryPage');
      $f->addFieldToTab("Root.Categories", new CheckboxsetField('Categories', 'Categories', $Categories));
   
      //Images
      $f->addFieldToTab("Root.CalloutImage", new ImageField('Image', 'Image', Null, Null, Null, 'Uploads/category_callout'));
return $f;
}

   //Set URLSegment to be unique on write
   function onBeforeWrite()
   {      
      // If there is no URLSegment set, generate one from Title
      if((!$this->URLSegment || $this->URLSegment == 'new-Project') && $this->Title != 'New Project')
      {
         $this->URLSegment = SiteTree::generateURLSegment($this->Title);
      }
      else if($this->isChanged('URLSegment'))
      {
         // Make sure the URLSegment is valid for use in a URL
         $segment = preg_replace('/[^A-Za-z0-9]+/','-',$this->URLSegment);
         $segment = preg_replace('/-+/','-',$segment);
         
         // If after sanitising there is no URLSegment, give it a reasonable default
         if(!$segment) {
            $segment = "Project-$this->ID";
         }
         $this->URLSegment = $segment;
      }

      // Ensure that this object has a non-conflicting URLSegment value.
      $count = 2;
      while($this->LookForExistingURLSegment($this->URLSegment))
      {
         $this->URLSegment = preg_replace('/-[0-9]+$/', null, $this->URLSegment) . '-' . $count;
         $count++;
      }

      parent::onBeforeWrite();
   }
      
   //Test whether the URLSegment exists already on another Project
   function LookForExistingURLSegment($URLSegment)
   {
      return (DataObject::get_one('Project', "URLSegment = '" . $URLSegment ."' AND ID != " . $this->ID));
   }
   
   //Generate the link for this Project
   function Link()
   {
      //if we are on a category page return that
      if(Director::CurrentPage()->ClassName == 'CategoryPage')
      {
         $Category = Director::CurrentPage();
      }
      //Otherwise just grab the first category this Project is in
      else
      {
         $Category = $this->Categories()->First();
      }   
      //Check we have a category then return the link
      if($Category)
      {
         return $Category->absoluteLink() . 'show/' . $this->URLSegment;      
      }
   }
   
}

catagorypage.php

<?php

class CategoryPage extends Page
{

   static $has_one = array(
      'CategoryBanner' => 'Image'
   );

   static $many_many = array(      
      'Projects' => 'Project'
   );

   static $allowed_children = array(
      'none' => 'none'
   );
   
   function getCMSFields()
   {
      $fields = parent::getCMSFields();
      
      //Banner Images
      $fields->addFieldToTab("Root.Content.Banner", new ImageField('CategoryBanner', 'Banner', Null, Null, Null, 'Uploads/category_banners'));
   
      return $fields;
   }   
}

class CategoryPage_Controller extends Page_Controller
{
   
   static $allowed_actions = array(
      'show'
   );
   
   public function init()
   {
      parent::init();
      
      Requirements::css('Projects/css/Projects.css');
   }
   
   //Return the list of Projects for this category
   public function getProjectsList()
   {
      return $this->Projects(Null, 'Title ASC');
   }

   //Get's the current Project from the URL, if any
public function getCurrentProject()
{
      $Params = $this->getURLParams();
      $URLSegment = Convert::raw2sql($Params['ID']);

if($URLSegment && $Project = DataObject::get_one('Project', "URLSegment = '" . $URLSegment . "'"))
{
return $Project;
}
}
   
   //Shows the Project detail page
   function show()
   {
      //Get the Project
      if($Project = $this->getCurrentProject())
      {
       $Data = array(
       'Project' => $Project,
            'MetaTitle' => $Project->MetaTitle
       );
      
       //return our $Data array to use, rendering with the ProjectPage.ss template
       return $this->customise($Data)->renderWith(array('ProjectPage', 'Page'));         
      }
      else //Project not found
      {
       return $this->httpError(404, 'Sorry that Project could not be found');
      }
   }
   
   //Generate out custom breadcrumbs
   public function Breadcrumbs() {

//Get the default breadcrumbs
$Breadcrumbs = parent::Breadcrumbs();

if($Project = $this->getCurrentProject())
{
//Explode them into their individual parts
$Parts = explode(SiteTree::$breadcrumbs_delimiter, $Breadcrumbs);

//Count the parts
$NumOfParts = count($Parts);

//Change the last item to a link instead of just text
$Parts[$NumOfParts-1] = ('<a href="' . $this->Link() . '">' . $Parts[$NumOfParts-1] . '</a>');

//Add our extra piece on the end
$Parts[$NumOfParts] = $Project->Title;

//Return the imploded array
$Breadcrumbs = implode(SiteTree::$breadcrumbs_delimiter, $Parts);
}

return $Breadcrumbs;
}    
}

projectimage.php

<?php

class ProjectImage extends DataObject
{
static $db = array (
'Title' => 'Text',
'Caption' => 'Text'
);

static $has_one = array (
'ProjectImageAttachment' => 'Image', //Needs to be an image
'Project' => 'Project'
);

public function getCMSFields_forPopup()
{
return new FieldSet(
new TextField('Title'),
new TextareaField('Caption'),
new FileIFrameField('ProjectImageAttachment')
);
}
}

Avatar
UncleCheese

4085 Posts

10 September 2011 at 1:35am

You have an ImageDOM set up to manage a relation named "Images", but no such relation is defined on your Project object.

--------------------
SilverStripe tips, tutorials, screencasts and more: http://www.leftandmain.com

Avatar
Hello_electro

Community Member, 80 Posts

10 September 2011 at 4:51am

UC: i added the below to the project.php file. Is this what you are referring to?

static $has_many = array (
'Images' => 'ProjectImage'
);

It ended up producing a a tab called "images" with nothing in it, when i create a new project in modeladmin.

i can now take advantage of the ImageDom though.

Avatar
UncleCheese

4085 Posts

13 September 2011 at 1:50am

That's why I don't use parent::getCMSFields() in ModelAdmin. It scaffolds all those fields in for you and a lot of them don't make sense. Best to start with an empty FieldSet and add the fields in how you want them.

--------------------
SilverStripe tips, tutorials, screencasts and more: http://www.leftandmain.com