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

In a DataObject how to convert String Input Textfield to has_many DataObject


Reply


7 Posts   1714 Views

Avatar
Allisone

Community Member, 27 Posts

17 March 2010 at 2:16am

Edited: 17/03/2010 2:23am

I have a wallpaper DataObject.
I'm managing my wallpaper in a DataObjectManager that is integrated in a category page.
A wallpaper has fields like title, image, rating and tags. The tags should be entered as String but stored in a seperate table....
So "blue, sky, nature" in a Textfield should be written into a table with a record for each tag like this
"blue"
"sky"
"nature"

First I had the tags as a simple string (sperated by ","). But as you start filtering wallpapers by tags and try to find other wallpapers with similar tags (like: show wallpapers that have the most amount of common tags) you want to use a second table and use sql's join queries.

So now I have a getCMSFields_forPopup() for my Picture Dataobject, that is being called, when adding/editing a picture to/of a gallery.
In this popup I have a nested DataObjectManager for the tags and it's not comfortable. Each time I add or edit a tag, the popup content is being replaced by the content of the add/edit dialog of the tags and when I'm finished adding/editing I can't get back to the original popup view. I can only press the general popup close and so the whole popup dissappears, although I didn't finish filling out the other fields (like choosing a title and other stuff) of the original popup view.

So either... is there a way to just close the inner DataObjectManager view instead of the whole popup or...
can I somehow have TextField for my tags where I can write something like "blue, sky, nature" but have a function that writes and reads those tags to/from other DataObjects that are bind by a has_many relationship ?

Here is a code excerpt:

<?php
class Wallpaper extends DataObject{
   static $db = array('Name'=>'Text');
   
   static $has_one = array('KategoriePage'=>'KategoriePage','WallpaperBild'=>'CustomImage');
   
   static $has_many = array('PictureTags'=>'PictureTag');

   public function getCMSFields_forPopup(){
         return new FieldSet(
            new ImageField('WallpaperBild','Das eigentliche Bild'),
            new TextField('Name','Name des Bildes'),
            new DataObjectManager($this,'PictureTags','PictureTag',PictureTag::$tabellen_namen,'getCMSFields_forPopup')
         );
   }
}
?>

<?php
class PictureTag extends DataObject{
   static $db = array('Name'=>'Text');

   static $has_one = array("Wallpaper"=>"Wallpaper");

   static $tabellen_namen = array('Name'=>'Tag');

   public function getCMSFields_forPopup(){
      return new FieldSet(
      new TextField('Name','Tag')
      );
   }
}
?>

Avatar
UncleCheese

4085 Posts

17 March 2010 at 2:45am

I would just do it in your onAfterWrite()..

public function onAfterWrite() {
parent::onAfterWrite();
if($this->Tags) {
foreach(explode(" ", $this->Tags) as $tag) {
$o = new Tag(array('SomeField' => $tag));
$o->write();
}
}
}

Avatar
Allisone

Community Member, 27 Posts

17 March 2010 at 3:15am

I haven't tried this, cause I don't understand how those onBeforeWrite onAfterWrite work, and because writing is only one thing, reading the other. Or should I just make a fake default value of the Textfield that is being newly generated (from the tags objects) each time getCMSFields_forPopup is loaded ?
But I will try to give it a try (right now busy with big sql query :D)

Avatar
UncleCheese

4085 Posts

17 March 2010 at 3:44am

Well, a Tag object would have a foreign key that associates it back to the holder dataobject. So you'd probably want to add

$o->YourHolderPageID = $this->ID;

to the function, as well.

Avatar
Allisone

Community Member, 27 Posts

17 March 2010 at 3:53am

how do I prevent the textfield (with the string) from beeing written to the database as well

Avatar
Allisone

Community Member, 27 Posts

17 March 2010 at 4:18am

I will try to simply not to mention it in the $db array, but I am stuck now with the filling of the Textfield

In the popup method of the Wallpaper DataObject

   public function getCMSFields_forPopup(){
      $tagsObj = DataObject::get("PictureTag","WallpaperID = ".$this->ID);
      foreach($tagsObj as $tag){
         if($tag->Name != ""){
            $tags .= $tag->Name;
         }
      }
      
      return new FieldSet(
      new TextField('Name','Name des Bildes'),
      new TextField("all_tags","Tags",$tags),


But ID is not known, well it's known but it's always 0

Avatar
Allisone

Community Member, 27 Posts

17 March 2010 at 5:14am

Maybe I'm approaching this completly wrong ?