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, Ed, biapar, Willr, Ingo, swaiba

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


Go to End
Reply


4 Posts   1260 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

Forum Moderator, 4102 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

Forum Moderator, 4102 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