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

FDOM and Newsletter Module


Go to End
Reply


7 Posts   1676 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.