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.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

DataObjectManager Module /

Discuss the DataObjectManager module, and the related ImageGallery module.

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

FDOM and Newsletter Module


Go to End


7 Posts   2071 Views

Avatar
mi3ll

Community Member, 24 Posts

10 September 2009 at 3:40am

Edited: 10/09/2009 4:02am

I was having a trial with the newsletter module and want to give the ability for clients to add attachments to their e-mails, so I am trying to use the File Data Object Manager to allow this, but I keep getting an Undefined Index: ID error when I click Add Newsletter Attachments. Here is the code I have:

Newsletter.php

static $has_many = array(
		"Recipients" => "Newsletter_Recipient",
		"SentRecipients" => "Newsletter_SentRecipient",
		"Attachments" => "NewsletterAttachment"
);

...

function getCMSFields($controller = null) {
		$group = DataObject::get_by_id("Group", $this->Parent()->GroupID);
		$sent_status_report = $this->renderWith("Newsletter_SentStatusReport");
		//$previewLink = Director::absoluteBaseURL() . 'admin/newsletter/preview/' . $this->ID;
		
		$attachments = new FileDataObjectManager(
					   $this,
					   'Attachments',
					   'NewsletterAttachment',
					   'Attachment',
					   array(
							 'Title' => 'Title',
							 'Description' => 'Description'
					   ),
					   'getCMSFields_forPopup'
				    );

		$ret = new FieldSet(
			new TabSet("Root",
				$mailTab = new Tab(_t('Newsletter.NEWSLETTER', 'Newsletter'),
					new TextField("Subject", _t('Newsletter.SUBJECT', 'Subject'), $this->Subject),
					new HtmlEditorField("Content", _t('Newsletter.CONTENT', 'Content'))
				),
				$attachTab = new Tab(_t('Newsletter.ATTACHMENTS', 'Attachments'),
					$attachments
				),
				$sentToTab = new Tab(_t('Newsletter.SENTREPORT', 'Sent Status Report'),
					new LiteralField("Sent Status Report", $sent_status_report)
				)
			)
		);

		if($this->Status != 'Draft') {
			$mailTab->push( new ReadonlyField("SendDate", _t('Newsletter.SENTAT', 'Sent at'), $this->SendDate) );
		}

		return $ret;
}

NewsletterAttachment.php

<?php

/**
 * Single attachment to a newsletter
 *
 * @package newsletter
 */
 
class NewsletterAttachment extends DataObject
{
	static $db = array (
		'Title' => 'Varchar',
		'Description' => 'Text',
	);
	
	static $has_one = array (
		'Attachment' => 'File',
		'Newsletter' => 'Newsletter'
	);
	
	public function getCMSFields_forPopup()
	{
		return new FieldSet(
			new TextField('Title'),
			new TextareaField('Description', 'Description', 2),
			new FileIFrameField('Attachment')
		);
	}
}

And here is the more detailed error:

[Notice] Undefined index: ID
GET /cms/admin/newsletter/NewsletterEditForm/field/Attachments/upload/

Line 261 in C:\wamp\www\cms\newsletter\code\NewsletterAdmin.php


Source

252 			} else {
253 				$form = $this->TypeEditForm();
254 			}
255     	}
256 		if($form) $form->disableDefaultAction();
257 		return $form;
258     }
259 
260     public function NewsletterEditForm() {
261     	$id = $_REQUEST['ID'] ? $_REQUEST['ID'] : $this->currentPageID();
262     	if(!is_numeric($id)) {
263     		$id = 0;
264     	}
265     	return $this->getNewsletterEditForm($id);
266     }
267 

I've dug around the newsletter code and I think it might be a problem with the unusual way the newsletter gets the edit form??
Any help would be appreciated!

Avatar
UncleCheese

Forum Moderator, 4102 Posts

10 September 2009 at 4:25am

That's some crappy code in the newsletter module. Submit this to Silverstripe.

$id = $_REQUEST['ID'] ? $_REQUEST['ID'] : $this->currentPageID();

should be

$id = (isset($_REQUEST['ID']) && is_numeric($_REQUEST['ID'])) ? $_REQUEST['ID'] : $this->currentPageID();

Avatar
mi3ll

Community Member, 24 Posts

11 September 2009 at 11:48am

Thanks for the quick reply UncleCheese! That fixed that error, but now it seems that the NewsletterEditForm does not receive an ID??

Here is the error I receive now when I click the Add Newsletter Attachment Button, any help is very much appreciated!

[Warning] DataObject::get_by_id passed a non-numeric ID #
GET /cms/admin/newsletter/NewsletterEditForm/field/Attachments/upload

Line 2566 in C:\wamp\www\cms\sapphire\core\model\DataObject.php
Source

2557 				$tableClasses = ClassInfo::dataClassesFor($callerClass);
2558 				$baseClass = array_shift($tableClasses);
2559 				return DataObject::get_one($callerClass,"`$baseClass`.`ID` = $id");
2560 
2561 				// This simpler code will be used by non-DataObject classes that implement DataObjectInterface
2562 			} else {
2563 				return DataObject::get_one($callerClass,"`ID` = $id");
2564 			}
2565 		} else {
2566 			user_error("DataObject::get_by_id passed a non-numeric ID #$id", E_USER_WARNING);
2567 		}
2568 	}
2569 
2570 	/**
2571 	 * Get the name of the base table for this object
2572 	 */

Trace

    * DataObject::get_by_id passed a non-numeric ID #
      Line 2566 of DataObject.php
    * DataObject::get_by_id(Newsletter,)
      Line 510 of NewsletterAdmin.php
    * NewsletterAdmin->getNewsletterEditForm()
      Line 262 of NewsletterAdmin.php
    * NewsletterAdmin->NewsletterEditForm(HTTPRequest)
      Line 162 of Controller.php
    * Controller->handleAction(HTTPRequest)
      Line 129 of RequestHandler.php
    * RequestHandler->handleRequest(HTTPRequest)
      Line 122 of Controller.php
    * Controller->handleRequest(HTTPRequest)
      Line 277 of Director.php
    * Director::handleRequest(HTTPRequest,Session)
      Line 121 of Director.php
    * Director::direct(/admin/newsletter/NewsletterEditForm/field/Attachments/upload)
      Line 118 of main.php

By the way, thanks for that new feature, the intelligent constructor! It works on File DataObject Managers and the like as well I hope?

Avatar
UncleCheese

Forum Moderator, 4102 Posts

11 September 2009 at 12:57pm

I seem to remember that the relationship to the holder has to come first. Try reversing your has_one so it reads:

static $has_one = array (
'Newsletter' => 'Newsletter'
'Attachment' => 'File',
);

Avatar
mi3ll

Community Member, 24 Posts

11 September 2009 at 9:58pm

I tried the fix but unfortunately I am still getting the same error... I also tried with a complextablefield but I get the same problem...

Avatar
UncleCheese

Forum Moderator, 4102 Posts

12 September 2009 at 1:10am

What is NewsletterAdmin?

Avatar
mi3ll

Community Member, 24 Posts

12 September 2009 at 1:16pm

Edited: 12/09/2009 2:07pm

It's the Administration Interface class for the Newsletters (extends LeftAndMain). I think since I can't get this working I will try with a single file attachment... Thanks for the help UncleCheese!

EDIT I tried the FileIFrameField and got the same problem, I think it's something to do with the Newsletter module, so I will try to ask for help in the other forums.