Forums / Developer / How I have made my newsletter

How I have made my newsletter

Author Message

ludo thomas

Friday 08 July 2005 2:23:10 am

1->siteaccess/override/site.ini.append.php

[MailSettings]
ContentType=text/html in [MailSettings]
Transport=sendmail
[email protected]
EmailSender=
_______________________________________________
2->create class NEWSLETTER
textfield/TITRE
XMLtext/CORPS

->create class user : ABONNES NEWSLETTER
Email/EMAIL
textfield/NAME
textfield/FIRST NAME

->create class userGroup : Abonnés newsletter
________________________________________________
3->create section newsletter (id 12 e.g)
________________________________________________

4->create à newsletter object in content and take node ID (e.g 332)
_______________________________________________________________________

5->site access/fr/override.ini.append.php

[newsletter_line]
Source=node/view/line.tpl
MatchFile=line/newsletter.tpl
Subdir=templates
Match[class_identifier]=newsletter

[page_newsletter]
Source=pagelayout.tpl
MatchFile=page_newsletter.tpl
Subdir=templates
Match[section]=12

[full_newsletter]
Source=node/view/full.tpl
MatchFile=full/newsletter.tpl
Subdir=templates
Match[class_identifier]=newsletter
_________________________________________________________

6-> create design/template/line/newsletter.tpl

{* File - Line view  *}

<form method="post" action={"content/action"|ezurl}>
                    <input type="hidden" name="ClassIdentifier" value="abonnes" />
                    <input type="hidden" name="NodeID" value="332" />
                    <input class="button new_comment" type="submit" name="NewButton" 

value="Créer" />
</form>



<div class="content-view-full">
    <div class="class-file">

    <h1>{$node.object.data_map.name.content|wash()}</h1>

    {section show=$node.object.data_map.description.content.is_empty|not}
        <div class="attribute-long">
            {attribute_view_gui attribute=$node.object.data_map.description}
        </div>
    {/section}

    <div class="attribute-file">
        <p>{attribute_view_gui attribute=$node.object.data_map.file 

icon_title=$node.name}</p>
    </div>
</div>


_

____________________________________________________________________________

*-> create plain/override/templates/full/newsletter.tpl

{* File - Full view *}
<form method="post" action={"content/action"|ezurl}>
                    <input type="hidden" name="ClassIdentifier" value="abonnes" />
                    <input type="hidden" name="NodeID" value="331" />
                    <input class="button new_comment" type="submit" name="NewButton" 

value="Inscription ici" />
</form> 
<form method="post" action={"content/action"|ezurl}>
<input type="hidden" name="ContentNodeID" value="314" />
 <input type="hidden" name="ContentObjectID" value="314" />
    <input class="button new_comment" input type="submit" name="ActionRemove"  

value="Desinscription" />
<input type="hidden" name="RedirectURI" value="content/view/full/2"  />
</form>
<div class="content-view-full">
    <div class="class-file">

    <h1>{$node.object.data_map.titre.content|wash()}</h1>

    {section show=$node.object.data_map.corps.content.is_empty|not}
        <div class="attribute-long">
            {attribute_view_gui attribute=$node.object.data_map.corps}
        </div>
    {/section}

    <div class="attribute-file">
        <p>{attribute_view_gui attribute=$node.object.data_map.file 

icon_title=$node.name}</p>
    </div>
</div>

________________________________________________________________________________
7-> create in design/plain/template:page_newsletter.tpl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="no" lang="no">

<head>

<style type="text/css">
    @import url({"stylesheets/core.css"|ezdesign});
    @import url({"stylesheets/site.css"|ezdesign});
	@import url({"stylesheets/site-colors.css"|ezdesign});
    @import url({"stylesheets/classes.css"|ezdesign});
	@import url({"stylesheets/classes-colors.css"|ezdesign});
    @import url({"stylesheets/debug.css"|ezdesign});
</style>

{section name=JavaScript loop=ezini( 'JavaScriptSettings', 'JavaScriptList', 'design.ini' ) 

}
    <script language="JavaScript" type="text/javascript" src={concat( 'javascript/',$:item 

)|ezdesign}></script>
{/section}

{literal}
<!--[if lt IE 6.0]>
<style>
div#maincontent-design { width: 100%; } /* This is needed to avoid width bug in IE 5.5 */
</style>
<![endif]-->
{/literal}

{include uri="design:page_head.tpl"}

</head>
<body>

<div id="allcontent">



{cache-block keys=$uri_string}
    <div id="topcontent">
	
	

        {let pagedesign=fetch_alias(by_identifier,hash(attr_id,sitestyle_identifier))}
        <div id="header">
            <div id="header-design">
			
			
			
			{menu name=TopMenu}

                 <a href={"/"|ezurl}><img src={"images/logo.jpg"|ezdesign} alt="retour vers 

l'accueil" /></a>
               {section show=ezini('Toolbar_top','Tool','toolbar.ini')|count}
        <div id="toolbar-top">
            <div class="toolbar-design">
                {tool_bar name=top view=line}
            </div>{* id="toolbar-design" *}
             <div class="break"></div>
        </div>{* id="toolbar-top" *}
    {/section} 
            </div>{* id="header-design" *}
        </div>{* id="header" *}
        {/let}

{/cache-block}

    

    {cache-block keys=$uri_string}
        <div class="break"></div>
    </div>{* id="topcontent" *}

  

    
    {/cache-block}

    <div id="path">
        <div id="path-design">
            {include uri="design:parts/path.tpl"}
        </div>{* id="path-design" *}
    </div>{* id="path" *}

    {cache-block keys=$uri_string}
    <hr class="hide" /> 

    <div id="columns">

        {menu name=LeftMenu}

        <hr class="hide" />
    {/cache-block}

        {section show=ezini( 'Toolbar_right', 'Tool', 'toolbar.ini' )|count}
            <div id="rightmenu">
                <div id="rightmenu-design">
                    <h3 class="hide">Right menu</h3>
                    <div id="toolbar-right">
                        <div class="toolbar-design">
                            {tool_bar name=right view=full}
                        </div>{* id="toolbar-design" *}
                    </div>{* id="toolbar-right" *}
                </div>{* id="rightmenu-design" *}
            </div>{* id="rightmenu" *}
        {/section}

        <hr class="hide" />

        {cache-block}
            {let maincontentstyle='maincontent-bothmenus'}

            {section show=eq(ezini('SelectedMenu','LeftMenu','menu.ini'),'')}
                {set maincontentstyle='maincontent-noleftmenu'}
            {/section}

            {section show=ezini('Toolbar_right','Tool','toolbar.ini')|count|eq(0)}
                {section show=$maincontentstyle|eq('maincontent-noleftmenu')}
                    {set maincontentstyle='maincontent-nomenus'}
                {section-else}
                    {set maincontentstyle='maincontent-norightmenu'}
                {/section}
            {/section}

            <div id="maincontent" class="{$maincontentstyle}">
                <div id="fix">
                    <div id="maincontent-design">
            {/let}

        {/cache-block}
                        {$module_result.content}

                    </div>{* id="maincontent-design" *}
                    <div class="break"></div>
                </div>{* id="fix" *}
            </div>{* id="maincontent" *}

            <div class="break"></div>
    </div>{* id="columns" *}

    <hr class="hide" />

    {section show=ezini('Toolbar_bottom','Tool','toolbar.ini')|count}
        <div id="toolbar-bottom">
            <div class="toolbar-design">
                {tool_bar name=bottom view=line}
            </div>{* id="toolbar-design" *}
            <div class="break"></div>
        </div>{* id="toolbar-bottom" *}
    {/section}

    <div id="footer">
        <div id="footer-design">

            <address>{"Powered by %linkStartTag eZ publish&reg; open source content 

management system %linkEndTag and development 

framework."|i18n("design/base",,hash('%linkStartTag',"<a 

href='http://ez.no'>",'%linkEndTag',"</a>" ))}<br 

/>{ezini('SiteSettings','MetaDataArray','site.ini').copyright}
            </address>

        </div>{* id="footer-design" *}
    </div>{* id="footer" *}

    <div class="break"></div>
</div>{* id="allcontent" *}

<!--DEBUG_REPORT-->

</body>
</html>

_________________________________________________________________________________

8-> Create kernel/classes/workflowtypes/event/mailinscription/mailinscriptiontype.php

<?php 

include_once( "kernel/classes/ezworkflowtype.php" ); 
define( "EZ_WORKFLOW_TYPE_MAIL_INSCRIPTION", "mailinscription");
class mailInscriptionType extends eZWorkflowEventType
{
/*!
Constructor
*/
function mailInscriptionType()
{
$this->eZWorkflowEventType( EZ_WORKFLOW_TYPE_MAIL_INSCRIPTION,
"Hello User" );
}
function execute( &$process, &$event )
{

 $parameters = $process->attribute( 'parameter_list' );
        $objectID =& $parameters['object_id'];
		
      
	  $obj =& eZContentObject::fetch($parameters['object_id']);
		$classID=& $obj->attribute( 'contentclass_id' );

// if a new receiver
if($classID == '34'){
	$data_map=& $obj->attribute( 'data_map' );
	$email = $data_map['email']->content();

	include_once( 'lib/ezutils/classes/ezmail.php' );

	$mail = new eZMail();
 			
            include_once( 'lib/ezutils/classes/ezmailtransport.php' );
			include_once( "lib/ezutils/classes/ezhttptool.php" );
			include_once( "kernel/classes/datatypes/ezuser/ezuser.php" );
			include_once( "kernel/classes/ezcontentclassattribute.php" );
			include_once( "kernel/classes/ezcontentclass.php" );
			include_once( "kernel/classes/ezcontentobject.php" );
	
	 $emailSender ='[email protected]';
  	 $subject = 'inscription à la newsletter';
	 $receiver = $email;
  	 $body='Nous avons le plaisir de vous annoncer votre inscription à notre 

newsletter';
            
            $mail->setSender( $emailSender );		
            $mail->setReceiver( $receiver );
            $mail->setSubject( $subject );
            $mail->setBody( $body );
            $mailResult = eZMailTransport::send( $mail );


$process->RedirectUrl = "/";
return EZ_WORKFLOW_TYPE_STATUS_REDIRECT ;
}


//if newsletter edit
elseif($classID == '33'){

	$listeAbonnes = eZContentObject::fetchList( true, 
  					array( 'contentclass_id' => 34,
         'status'          =>  EZ_CONTENT_OBJECT_STATUS_PUBLISHED) 
);
	
	
include_once( 'lib/ezutils/classes/ezmail.php' ); 
			
include_once( 'lib/ezutils/classes/ezmailtransport.php' );	
include_once( "kernel/common/template.php" );
foreach($listeAbonnes as $Abonnes){

	$data_map=& $Abonnes->attribute( 'data_map' );
	$email = $data_map['email']->content();
			
			include_once( 'kernel/classes/ezcontentobjecttreenode.php' );
			
			
			
			$mail = new eZMail();

 			     
					
////////////////////////////////////////////////////////////////////////
			$nodeID='332';// newsletter object node // //data_map=titre+corps
			
	$node =& eZContentObjectTreeNode::fetch( $nodeID );
			
			
			 $tpl =& eZTemplate::instance();
	//$tpl = & templateInit();
	$tpl->setVariable( 'node_id', $nodeID );
	$tpl->setVariable( 'node', $node );
	
	 $mailTemplateResult =& $tpl->fetch( 

'extension/newsletter/design/standard/templates/newsletter/newsletter.tpl' );

$mailTemplateResult=ereg_replace("/var","http://www.isuga.fr/var",$mailTemplateResult);
	////////////////////////////////////////////////////////////////////	
		
		 $emailSender ='[email protected]';
  		 $receiver = $email;
		
			$mail->setBody( $mailTemplateResult);

            $mail->setSender( $emailSender );		
            $mail->setReceiver( $receiver );
            $subject = 'Nouvelle Newsletter';
           
            $mail->setSubject( $subject );
           
            $mailResult = eZMailTransport::send( $mail );
		
			
//debug - uncomment next 3lines if you want to see what should be in the body

//echo "This is your Mailbody: <plaintext>";
//echo " $mailTemplateResult </plaintext>";
//exit();

}
			
			
//return EZ_WORKFLOW_TYPE_STATUS_ACCEPTED;

$process->RedirectUrl = "/";
return EZ_WORKFLOW_TYPE_STATUS_REDIRECT ;
}
else{
return EZ_WORKFLOW_TYPE_STATUS_ACCEPTED;
}

}
}
eZWorkflowEventType::registerType( EZ_WORKFLOW_TYPE_MAIL_INSCRIPTION,
"mailinscriptiontype" );

__________________________________________________________________________________

*-> create in design/plain/override/templates/edit/abonnes.tpl

<form enctype="multipart/form-data" method="post" action={concat( "/content/edit/", 

$object.id, "/", $edit_version, "/", $edit_language|not|choose( concat( $edit_language, "/" 

), '' ) )|ezurl}>
<table class="layout" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
    <td valign="top">
    <div class="maincontentheader">
    <h1>{"Edit %1 - 

%2"|i18n("design/standard/content/edit",,array($class.name|wash,$object.name|wash))}</h1>
    </div>

    {include uri="design:content/edit_validation.tpl"}

    <input type="hidden" name="MainNodeID" value="{$main_node_id}" />
    <br/>

    {include uri="design:content/edit_attribute.tpl"}
    <br/>

    <div class="buttonblock">
    <input class="defaultbutton" type="submit" name="PublishButton" value="{'Send for 

publishing'|i18n('design/standard/content/edit')}" />
    <input class="button" type="submit" name="DiscardButton" 

value="{'Discard'|i18n('design/standard/content/edit')}" />
    <input type="hidden" name="DiscardConfirm" value="0" />
    </div>
    </td>
</tr>
</table>

</form>
_

_______________________________________________________________________________
9->create extension/newsletter/design/standard/templates/newsletter/newsletter.tpl

<div class="content-view-full">
    <div class="class-file">
	
    <h1>{$node.object.data_map.titre.content|wash()}</h1>

 
   
     {$node.object.data_map.corps.content.output.output_text}

</div>
</div>

_____________________________________________________________________________________

10-> in settings/override/workflow.ini:

add in [eventSettings]
AvailableEventTypes[]=event_mailinscription
______________________________________________________________________________________

11-> in admin/workflows/standard

create a new workflow process name= "inscription mail"
and choose 'event/hello user'
______________________________________________________________________________________

12-> in admin/triggers
content publish after => choose workflow:inscription mail
________________________________________________________________________________________

13-> in admin/role&policies

create a new group:newsletter

choose anonymous/modify policies

and create:
content create class(abonnés newsletter)
content edit class(abonnés newsletter)
content remove class(abonnés newsletter)
_______________________________________________________________________________________
And that'all,
It works perfectly

Bertrand Dunogier

Tuesday 12 July 2005 10:25:54 am

Thanks for sharing your experience, I'm sure it's going to be very useful to me in the near future !

Ole Brudvik

Sunday 28 August 2005 3:14:12 pm

Hi Ludo, I am trying to use your simplenewsletter extension. Following your guidelines. My problem is that i dont see how the end product or tool will be. How do you actually send a newsletter to many registered users. It would be nice if you can describe how to make and send newsletters.

Thanks
Ole

ludo thomas

Tuesday 30 August 2005 12:38:32 am

hi ole,

If you have correctly done the newsleter's extension installation, you should have ,in the ezpublish root directory 1 newsletter class object which name is like
'infoBazar aout 2005'.

I kwow it's not very clear but this object is the newsletter.(You can rename it as 'newsletter' if you prefer)

secondly you have to create an acces to anonymous user for seeing the newsletter class, and create a button for seeing this page.

3.add content to newsletter object editing the object in the admin interface.

each time you edit and publish the newsletter object, content of this object is automatically send to the receivers.

to signup to the newsletter, anonymous users have a button that appears in the newsletter page of your site.(automatically too..)

for each inscription , they receive an information email that say what you want(in newsletter.ini)

you can add manually a newsletter receiver.go to users/newsletter/ and add a new 'Abonnné newsletter'.

Important:
If you are sure that the workflow doesn't work right, put the extension/newsletter/eventypes/event/mailinscription directory into :Kernel/classes/workflowtypes/event.

Kristof Coomans

Tuesday 30 August 2005 2:21:29 am

Improvement of step 10:

You need to tell eZ publish that the extension newsletter contains workflow event types.

[EventSettings]
ExtensionDirectories[]=newsletter
AvailableEventTypes[]=event_mailinscription

Now it will check the extension called "newsletter" for workflow event types. The workaround under "<i>Important</i>" in the previous post won't be necessary anymore.

Instead of putting these settings in <b>settings/override/workflow.ini</b>, you can put them inside the extension in the file <b>extension/newsletter/settings/workflow.ini.append</b>. If you disable the extension, eZ publish will not read the settings of the extension anymore and the workflow type in the extension will not be available anymore.

independent eZ Publish developer and service provider | http://blog.coomanskristof.be | http://ezpedia.org

ludo thomas

Tuesday 30 August 2005 5:24:24 am

the worklfow.ini is already in the newsletter/settings.

but in some installations, workflow.ini is not read, so I need to put this file in the kernel.

Do you know why this bug?
thanks.

Kristof Coomans

Tuesday 30 August 2005 6:18:43 am

Never encountered this problem before.

On which version of eZ publish does this happen?

independent eZ Publish developer and service provider | http://blog.coomanskristof.be | http://ezpedia.org

ludo thomas

Tuesday 30 August 2005 6:34:06 am

it appears on 3.5.2

but on one site it works fine an on two others it doesn't work.
I've verify all the settings.
It seems to be the same parametters in the 3 cases???
I don't understand nothing..