<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.x2crm.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drsimonz</id>
		<title>X2Engine - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.x2crm.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drsimonz"/>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/wiki/Special:Contributions/Drsimonz"/>
		<updated>2026-05-20T19:38:45Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=975</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=975"/>
				<updated>2013-03-08T22:44:55Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2CRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|right]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
{{clear}}&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=490</id>
		<title>Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=490"/>
				<updated>2012-10-19T21:26:42Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Widget views */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
One immediately recognizable features of the web application is the diversity of widgets on the right-hand side of the window, each containing some user input and/or output. Each of those widgets is generated by a class that extends X2Widget, which can be found in &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt;. The widgets are loaded into the controller by the [[x2propdoc:x2base.html#_filterSetPortlets|setPortlets]] filter (and inherited by all subclasses of [[x2doc:x2base|x2base]]).&lt;br /&gt;
&lt;br /&gt;
= Creating a widget =&lt;br /&gt;
The first step to creating a new widget is to make a new PHP class that extends [[x2doc:X2Widget|X2Widget]], name the file after the class, and to place the widget in the &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt; directory. Note the inheritance of properties from [[yii:CWidget|CWidget]], the parent class of X2Widget. A complete widget should contain, at minimum, an override of the [[yii:CWidget#run-detail|CWidget::run()]] method that constructs the markup associated with that widget.&lt;br /&gt;
&lt;br /&gt;
== Adding the widget to the registry ==&lt;br /&gt;
Widgets loaded by &amp;lt;tt&amp;gt;filterSetPortlets&amp;lt;/tt&amp;gt; are loaded are contained in the application configuration parameter &amp;quot;registeredWidgets&amp;quot; (in &amp;lt;tt&amp;gt;protected/config/main.php&amp;lt;/tt&amp;gt;), in the format &amp;quot;ClassName&amp;quot; =&amp;gt; &amp;quot;Widget Title&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		'registeredWidgets'=&amp;gt;array(&lt;br /&gt;
			'TimeZone' =&amp;gt; 'Time Zone',&lt;br /&gt;
			'MessageBox'=&amp;gt;'Message Board',&lt;br /&gt;
			'QuickContact'=&amp;gt;'Quick Contact',&lt;br /&gt;
			'GoogleMaps'=&amp;gt;'Google Map',&lt;br /&gt;
			'TwitterFeed'=&amp;gt;'Twitter Feed',&lt;br /&gt;
			'ChatBox'=&amp;gt;'Chat',&lt;br /&gt;
			'NoteBox'=&amp;gt;'Note Pad',&lt;br /&gt;
			'ActionMenu'=&amp;gt;'My Actions',&lt;br /&gt;
			'TagCloud'=&amp;gt;'Tag Cloud',&lt;br /&gt;
			'OnlineUsers'=&amp;gt;'Active Users',&lt;br /&gt;
			'MediaBox' =&amp;gt; 'Media',&lt;br /&gt;
			'DocViewer' =&amp;gt; 'Doc Viewer',&lt;br /&gt;
			'TopSites' =&amp;gt; 'Top Sites',&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widget views ==&lt;br /&gt;
Like controllers, widgets use view files to generate the final HTML. The markup associated with a widget can therefore be placed in a separate view file, then rendered in the widget's &amp;lt;tt&amp;gt;run()&amp;lt;/tt&amp;gt; method, passing it any parameters needed in the view:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;render('actionMenu', array(&lt;br /&gt;
	'total' =&amp;gt; $total,&lt;br /&gt;
	'unfinished' =&amp;gt; $unfinished,&lt;br /&gt;
	'overdue' =&amp;gt; $overdue,&lt;br /&gt;
	'complete' =&amp;gt; $complete,&lt;br /&gt;
));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, widgets look for view files in &amp;lt;tt&amp;gt;protected/components/views&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=489</id>
		<title>Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=489"/>
				<updated>2012-10-19T21:03:49Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Widget views */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
One immediately recognizable features of the web application is the diversity of widgets on the right-hand side of the window, each containing some user input and/or output. Each of those widgets is generated by a class that extends X2Widget, which can be found in &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt;. The widgets are loaded into the controller by the [[x2propdoc:x2base.html#_filterSetPortlets|setPortlets]] filter (and inherited by all subclasses of [[x2doc:x2base|x2base]]).&lt;br /&gt;
&lt;br /&gt;
= Creating a widget =&lt;br /&gt;
The first step to creating a new widget is to make a new PHP class that extends [[x2doc:X2Widget|X2Widget]], name the file after the class, and to place the widget in the &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt; directory. Note the inheritance of properties from [[yii:CWidget|CWidget]], the parent class of X2Widget. A complete widget should contain, at minimum, an override of the [[yii:CWidget#run-detail|CWidget::run()]] method that constructs the markup associated with that widget.&lt;br /&gt;
&lt;br /&gt;
== Adding the widget to the registry ==&lt;br /&gt;
Widgets loaded by &amp;lt;tt&amp;gt;filterSetPortlets&amp;lt;/tt&amp;gt; are loaded are contained in the application configuration parameter &amp;quot;registeredWidgets&amp;quot; (in &amp;lt;tt&amp;gt;protected/config/main.php&amp;lt;/tt&amp;gt;), in the format &amp;quot;ClassName&amp;quot; =&amp;gt; &amp;quot;Widget Title&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		'registeredWidgets'=&amp;gt;array(&lt;br /&gt;
			'TimeZone' =&amp;gt; 'Time Zone',&lt;br /&gt;
			'MessageBox'=&amp;gt;'Message Board',&lt;br /&gt;
			'QuickContact'=&amp;gt;'Quick Contact',&lt;br /&gt;
			'GoogleMaps'=&amp;gt;'Google Map',&lt;br /&gt;
			'TwitterFeed'=&amp;gt;'Twitter Feed',&lt;br /&gt;
			'ChatBox'=&amp;gt;'Chat',&lt;br /&gt;
			'NoteBox'=&amp;gt;'Note Pad',&lt;br /&gt;
			'ActionMenu'=&amp;gt;'My Actions',&lt;br /&gt;
			'TagCloud'=&amp;gt;'Tag Cloud',&lt;br /&gt;
			'OnlineUsers'=&amp;gt;'Active Users',&lt;br /&gt;
			'MediaBox' =&amp;gt; 'Media',&lt;br /&gt;
			'DocViewer' =&amp;gt; 'Doc Viewer',&lt;br /&gt;
			'TopSites' =&amp;gt; 'Top Sites',&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widget views ==&lt;br /&gt;
Like controllers, widgets use view files to generate the final HTML. The markup associated with a widget can be placed in a separate view file in that directory and then rendered in the widget's &amp;lt;tt&amp;gt;run()&amp;lt;/tt&amp;gt; method, passing it any parameters needed in the view:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;render('actionMenu', array(&lt;br /&gt;
	'total' =&amp;gt; $total,&lt;br /&gt;
	'unfinished' =&amp;gt; $unfinished,&lt;br /&gt;
	'overdue' =&amp;gt; $overdue,&lt;br /&gt;
	'complete' =&amp;gt; $complete,&lt;br /&gt;
));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, widgets look for view files in &amp;lt;tt&amp;gt;protected/components/views&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=488</id>
		<title>Widgets</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Widgets&amp;diff=488"/>
				<updated>2012-10-19T21:03:32Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Widget views */ improved wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
One immediately recognizable features of the web application is the diversity of widgets on the right-hand side of the window, each containing some user input and/or output. Each of those widgets is generated by a class that extends X2Widget, which can be found in &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt;. The widgets are loaded into the controller by the [[x2propdoc:x2base.html#_filterSetPortlets|setPortlets]] filter (and inherited by all subclasses of [[x2doc:x2base|x2base]]).&lt;br /&gt;
&lt;br /&gt;
= Creating a widget =&lt;br /&gt;
The first step to creating a new widget is to make a new PHP class that extends [[x2doc:X2Widget|X2Widget]], name the file after the class, and to place the widget in the &amp;lt;tt&amp;gt;protected/components&amp;lt;/tt&amp;gt; directory. Note the inheritance of properties from [[yii:CWidget|CWidget]], the parent class of X2Widget. A complete widget should contain, at minimum, an override of the [[yii:CWidget#run-detail|CWidget::run()]] method that constructs the markup associated with that widget.&lt;br /&gt;
&lt;br /&gt;
== Adding the widget to the registry ==&lt;br /&gt;
Widgets loaded by &amp;lt;tt&amp;gt;filterSetPortlets&amp;lt;/tt&amp;gt; are loaded are contained in the application configuration parameter &amp;quot;registeredWidgets&amp;quot; (in &amp;lt;tt&amp;gt;protected/config/main.php&amp;lt;/tt&amp;gt;), in the format &amp;quot;ClassName&amp;quot; =&amp;gt; &amp;quot;Widget Title&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
		'registeredWidgets'=&amp;gt;array(&lt;br /&gt;
			'TimeZone' =&amp;gt; 'Time Zone',&lt;br /&gt;
			'MessageBox'=&amp;gt;'Message Board',&lt;br /&gt;
			'QuickContact'=&amp;gt;'Quick Contact',&lt;br /&gt;
			'GoogleMaps'=&amp;gt;'Google Map',&lt;br /&gt;
			'TwitterFeed'=&amp;gt;'Twitter Feed',&lt;br /&gt;
			'ChatBox'=&amp;gt;'Chat',&lt;br /&gt;
			'NoteBox'=&amp;gt;'Note Pad',&lt;br /&gt;
			'ActionMenu'=&amp;gt;'My Actions',&lt;br /&gt;
			'TagCloud'=&amp;gt;'Tag Cloud',&lt;br /&gt;
			'OnlineUsers'=&amp;gt;'Active Users',&lt;br /&gt;
			'MediaBox' =&amp;gt; 'Media',&lt;br /&gt;
			'DocViewer' =&amp;gt; 'Doc Viewer',&lt;br /&gt;
			'TopSites' =&amp;gt; 'Top Sites',&lt;br /&gt;
		),&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Widget views ==&lt;br /&gt;
Like controllers, widgets use view files to generate the final HTML. The markup associated with a widget can be placed in a separate view file in that directory and then rendered in the widget's &amp;lt;tt&amp;gt;run()&amp;lt;/tt&amp;gt; method, passing it any parameters needed in the view:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;render('actionMenu', array(&lt;br /&gt;
	'total' =&amp;gt; $total,&lt;br /&gt;
	'unfinished' =&amp;gt; $unfinished,&lt;br /&gt;
	'overdue' =&amp;gt; $overdue,&lt;br /&gt;
	'complete' =&amp;gt; $complete,&lt;br /&gt;
));&amp;lt;/sourcecodehiglight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, widgets look for view files in &amp;lt;tt&amp;gt;protected/components/views&amp;lt;/tt&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=MediaWiki:Filedelete-reason-dropdown&amp;diff=487</id>
		<title>MediaWiki:Filedelete-reason-dropdown</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=MediaWiki:Filedelete-reason-dropdown&amp;diff=487"/>
				<updated>2012-10-19T19:59:14Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: Created page with &amp;quot;*Common delete reasons ** Copyright violation ** Duplicated file ** Not necessary&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Common delete reasons&lt;br /&gt;
** Copyright violation&lt;br /&gt;
** Duplicated file&lt;br /&gt;
** Not necessary&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=486</id>
		<title>File:Custom folder.gif</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=486"/>
				<updated>2012-10-19T19:58:16Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: Drsimonz uploaded a new version of &amp;amp;quot;File:Custom folder.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=485</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=485"/>
				<updated>2012-10-19T19:51:57Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|right]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
{{clear}}&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Template:Clear&amp;diff=484</id>
		<title>Template:Clear</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Template:Clear&amp;diff=484"/>
				<updated>2012-10-19T19:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: Created page with &amp;quot;&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=483</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=483"/>
				<updated>2012-10-19T19:50:41Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|right]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
{{clear}}&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=482</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=482"/>
				<updated>2012-10-19T19:41:09Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|right]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=481</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=481"/>
				<updated>2012-10-19T19:37:52Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Overriding Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|right]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=480</id>
		<title>File:Custom folder.gif</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=480"/>
				<updated>2012-10-19T19:37:06Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: Drsimonz uploaded a new version of &amp;amp;quot;File:Custom folder.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=479</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=479"/>
				<updated>2012-10-19T19:35:00Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Overriding Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:Custom_folder.gif|left]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=478</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=478"/>
				<updated>2012-10-19T19:34:44Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
[[File:custom_folder.gif|left]]&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=477</id>
		<title>File:Custom folder.gif</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=File:Custom_folder.gif&amp;diff=477"/>
				<updated>2012-10-19T19:21:07Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=476</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=476"/>
				<updated>2012-10-19T19:14:55Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Known Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only PHP files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=475</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=475"/>
				<updated>2012-10-19T19:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM's source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. But this could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates.&lt;br /&gt;
&lt;br /&gt;
X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
* Currently, only php files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;br /&gt;
&lt;br /&gt;
* There is no guarantee a customized installation will still work after an update. You will still have to manually merge changes if you want (or need) to use an updated version of a customized file. Depending on the file, you may have to do this for most automatic updates (since some files are changed far more often than others). Luckilly, most of our changes are usually in controller files, which can be extended rather than just replaced, so the updates are less likely to be incompatible with your modifications.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=474</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=474"/>
				<updated>2012-10-19T19:07:44Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
In the past, customizing software was impossible without buying expensive developer services. With modern web-based applications like X2EngineCRM, the source code is completely transparent and totally under your control. There's no need to compiled PHP, so altering your software is a simply a matter of hacking around in the files. Traditionally, this meant directly altering the source code within X2Engine's file structure. That alone could be problematic to keep track of, given the vast number of files. On top of that, automatic updates to any of those files would wipe out all of your changes, so you would have to choose between customization and receiving updates. X2Engine provides a means to alter X2Engine's classes and templates without modifying the original source files. You can create an alternate version of any PHP file, while preserving the original, which makes it much easier to keep track of your changes as well as preserving your alterations through updates. You may still need to rework your custom code when an update is incompatible, but it will be much easier.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
Currently, only php files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=473</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=473"/>
				<updated>2012-10-19T18:15:04Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Overriding Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM provides the means to manually customize classes and templates without modifying the source files. This can be performed by creating new files in &amp;lt;tt&amp;gt;custom&amp;lt;/tt&amp;gt;. The need for this arises because the source files may be overwritten (and their customizations destroyed) during each software update, whereas if customizations are stored in other files, they remain in effect, and barring any incompatibilities between new versions and customizations in those files, they will still work as intended.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. X2Engine's customization framework resides in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory, which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
Currently, only php files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=472</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=472"/>
				<updated>2012-10-19T18:14:23Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Overriding Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM provides the means to manually customize classes and templates without modifying the source files. This can be performed by creating new files in &amp;lt;tt&amp;gt;custom&amp;lt;/tt&amp;gt;. The need for this arises because the source files may be overwritten (and their customizations destroyed) during each software update, whereas if customizations are stored in other files, they remain in effect, and barring any incompatibilities between new versions and customizations in those files, they will still work as intended.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. Traditionally, customizing the software meant changing the original files. That alone could be problematic to keep track of, given the vast number of files. And of course, automatic updates to any of those files would wipe out all of your changes. X2Engine includes a customization framework that in the &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; directory which mirrors the structure of the source code. For example, &amp;lt;tt&amp;gt;/custom/protected/components&amp;lt;/tt&amp;gt; corresponds to &amp;lt;tt&amp;gt;/protected/components&amp;lt;/tt&amp;gt;. Any php file placed in &amp;lt;tt&amp;gt;/custom&amp;lt;/tt&amp;gt; will be used instead of the original.&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
Currently, only php files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=471</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=471"/>
				<updated>2012-10-19T18:08:50Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM provides the means to manually customize classes and templates without modifying the source files. This can be performed by creating new files in &amp;lt;tt&amp;gt;custom&amp;lt;/tt&amp;gt;. The need for this arises because the source files may be overwritten (and their customizations destroyed) during each software update, whereas if customizations are stored in other files, they remain in effect, and barring any incompatibilities between new versions and customizations in those files, they will still work as intended.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Overriding Files =&lt;br /&gt;
Practically any php file used in X2Engine can be overridden. Traditionally, customizing the software meant changing the original files. That alone could be problematic to keep track of, given the vast number of files. And of course, automatic updates to any of those files would wipe out all of your changes. X2Engine includes a customization framework &lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
X2Engine is built on Yii, which uses MVC (model-view-controller) architecture. Overriding an entire file is practical when dealing with views or smaller classes (such as models), but controllers can present a greater challenge. It's only a matter of time before we update one of the 1500+ lines of code in a controller. This means you have to manually find and transfer your changes from the old version, which is time-consuming. To remedy this, we allow substitution of any controller in X2Engine with an extended class.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt; containing the following:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
Currently, only php files can be substituted. To change a CSS or Javascript file you would have to edit the original file.&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=470</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=470"/>
				<updated>2012-10-18T19:49:36Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Extending Controllers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM provides the means to manually customize classes and templates without modifying the source files. This can be performed by creating new files in &amp;lt;tt&amp;gt;custom&amp;lt;/tt&amp;gt;. The need for this arises because the source files may be overwritten (and their customizations destroyed) during each software update, whereas if customizations are stored in other files, they remain in effect, and barring any incompatibilities between new versions and customizations in those files, they will still work as intended.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
Overriding the entire file is practical when dealing with view files or smaller classes (such as models), but controllers can present a bigger problem. It's only a matter of time before something in a 2000-line controller file will change in base code. This means you would have to manually merge the changes, which is time-consuming. To remedy this, we allow substitution of an extended class for any controller in X2Engine.&lt;br /&gt;
&lt;br /&gt;
Whenever a controller is loaded, X2Engine checks for the same filename with &amp;quot;My&amp;quot; at the beginning. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in &amp;lt;tt&amp;gt;/custom/protected/modules/contacts/controllers&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=469</id>
		<title>Customization Framework</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Customization_Framework&amp;diff=469"/>
				<updated>2012-10-18T19:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* Extending Classes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
X2EngineCRM provides the means to manually customize classes and templates without modifying the source files. This can be performed by creating new files in &amp;lt;tt&amp;gt;custom&amp;lt;/tt&amp;gt;. The need for this arises because the source files may be overwritten (and their customizations destroyed) during each software update, whereas if customizations are stored in other files, they remain in effect, and barring any incompatibilities between new versions and customizations in those files, they will still work as intended.&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
(in progress)&lt;br /&gt;
&lt;br /&gt;
= Extending Controllers =&lt;br /&gt;
Overriding the entire file is practical when dealing with view files or smaller classes (such as models), but controllers can present a bigger problem. It's only a matter of time before something in a 2000-line controller file will change in base code. This means you would have to manually merge the changes, which is time-consuming. To remedy this, we allow substitution of an extended class for any controller in X2Engine. For example, if you want to override a single action to ContactsController, you can create a file called MyContactsController in '''/custom/protected/modules/contacts/controllers'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class MyContactsController extends ContactsController {&lt;br /&gt;
    function actionIndex() {&lt;br /&gt;
        echo 'Hello World!';&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This file will automatically be used instead of ContactsController and should still work if ContactsController is changed in an update. You may still need to manually merge changes if an update alters the same part of the controller that you changed, but it will be much easier to find.&lt;br /&gt;
&lt;br /&gt;
= Known Issues =&lt;br /&gt;
(in progress)&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	<entry>
		<id>http://wiki.x2crm.com/index.php?title=Installation&amp;diff=387</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="http://wiki.x2crm.com/index.php?title=Installation&amp;diff=387"/>
				<updated>2012-10-05T17:39:34Z</updated>
		
		<summary type="html">&lt;p&gt;Drsimonz: /* System Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Support]]&lt;br /&gt;
&lt;br /&gt;
= System Requirements =&lt;br /&gt;
Before installing X2EngineCRM, you should first ascertain whether your hosting environment is properly configured. The following features are '''required''' for X2EngineCRM to function properly:&lt;br /&gt;
&lt;br /&gt;
* '''PHP version 5.3 or later'''&lt;br /&gt;
* [http://php.net/manual/en/book.curl.php PHP's cURL library] (almost always included by default)&lt;br /&gt;
* A password-protected '''MySQL''' database server connection, and a database on which the user of the connection has all rights (i.e. select, drop, create and update).&lt;br /&gt;
* The [http://httpd.apache.org/ Apache 2] web server, with [http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html mod_rewrite] enabled.&lt;br /&gt;
&lt;br /&gt;
Next, ensure that the requirements of [http://www.yiiframework.com Yii Framework], the application building framework on which X2Engine is designed, are met. To do this:&lt;br /&gt;
* [http://www.yiiframework.com/ Download Yii Framework] and upload the &amp;quot;requirements&amp;quot; folder to your web server.&lt;br /&gt;
* Navigate to the requirements folder on your server using a web browser. '''You should see a page that looks similar to this:'''&lt;br /&gt;
&lt;br /&gt;
[[File:YiiRequirements.png|border|400px]]&lt;br /&gt;
&lt;br /&gt;
'''Note that the following requirements are not necessary:'''&lt;br /&gt;
&lt;br /&gt;
* The SQLite and PostgreSQL extensions; X2Engine depends on MySQL, so these other extensions will not be used.					&lt;br /&gt;
* The DOM extension; it is not required.					&lt;br /&gt;
* The caching extensions (Memcache, APC cache); caching is not currently required, although APC can increase performance					&lt;br /&gt;
* The SOAP extension; the classes that depend on it are not used&lt;br /&gt;
[[Category:Support]]&lt;br /&gt;
&lt;br /&gt;
= If Requirements Are Not Met =&lt;br /&gt;
== Getting The Right PHP Version ==&lt;br /&gt;
In some cases, it may be possible to enable PHP 5.3+ using an [http://httpd.apache.org/docs/2.2/howto/htaccess.html Apache override]; see &lt;br /&gt;
* [http://www.velvetblues.com/web-development-blog/activate-php-5-3-hostgator-godaddy/ Velvet Blues: How to Activate PHP 5.3 on HostGator and GoDaddy]&lt;br /&gt;
* [http://kb.siteground.com/article/How_to_have_different_Php__MySQL_versions.html SiteGround knowledge base: How to switch to a different PHP version]&lt;br /&gt;
By adding the appropriate directives to the &amp;lt;tt&amp;gt;.htaccess&amp;lt;/tt&amp;gt; file in the web root of X2EngineCRM (NOT replacing the file, but changing it), the PHP version can ideally be set. You can test whether this method succeeds by uploading a file into the web root called &amp;lt;tt&amp;gt;phpinfo.php&amp;lt;/tt&amp;gt; containing&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php phpinfo(); ?&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Navigate to it in your web browser, and look for the version information. Delete the file when done; displaying PHP info publicly for indefinite time can pose a security risk.&lt;br /&gt;
&lt;br /&gt;
In other cases, it may be possible to enable later versions of PHP via the web hosting control interface (i.e. CPanel or Webmin). Otherwise, the only option will be to contact the hosting provider and request that version 5.3 be made available.&lt;br /&gt;
&lt;br /&gt;
== Enabling PHP extensions ==&lt;br /&gt;
If your server does not meet the minimum system requirements for running X2Engine, and you are a system administrator of your server, you will be able to install the necessary modules. Note, however, that as of the most recent version, the MySQL PDO extension is the only extension used by X2Engine that isn't included by default and always enabled in PHP 5.3; the reflection class and extensions SPL, PCRE and Ctype should all be available if PHP is at version 5.3 or later.&lt;br /&gt;
&lt;br /&gt;
In most distributions of Linux, PHP extensions can be easily installed by the distribution's default [[wikipedia:Package management system|Package management system]]. That is the recommended method of installing them; typically, the package manager will automatically configure and reload the HTTP server to enable them.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu &amp;amp;amp; Debian ===&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo apt-get install php5-mysql&amp;lt;/pre&amp;gt;&lt;br /&gt;
The extension &amp;lt;tt&amp;gt;mbstring&amp;lt;/tt&amp;gt; will typically be included in the Apache module package.&lt;br /&gt;
&lt;br /&gt;
=== CentOS, RHEL &amp;amp;amp; Oracle Linux ===&lt;br /&gt;
&amp;lt;pre&amp;gt;sudo yum install php-pdo php-mbstring&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Without Requirements: What Won't Work ==&lt;br /&gt;
If your server environment does not meet the minimum system requirements, and it is not possible to add PHP extensions, you can still install X2Engine, though it is '''not''' recommended. Note the following issues that can occur:&lt;br /&gt;
&lt;br /&gt;
* cURL extension missing:&lt;br /&gt;
** Time zone widget will not work &amp;lt;ref&amp;gt;[http://x2community.com/index.php?/topic/386-cant-open-contact-view/ X2Community Forums: &amp;quot;Can't open contact View&amp;quot;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Cannot use local scripts that make API calls&lt;br /&gt;
* PHP version earlier than 5.3 ('''not''' recommended; has not been tested on versions earlier than 5.3)&lt;br /&gt;
** Chat widget will not work&lt;br /&gt;
** Installation form does not fully render (X2EngineCRM versions 1.6.5 - 1.6.6)&lt;br /&gt;
** Numerous controllers, models and components that use the function [http://www.php.net/manual/en/function.lcfirst.php lcfirst]&lt;br /&gt;
* mbstring extension missing&lt;br /&gt;
** Application crashes&lt;br /&gt;
* pdo_mysql extension missing&lt;br /&gt;
** Application cannot run (required by Yii)&lt;br /&gt;
* All other PHP extensions:&lt;br /&gt;
** Application cannot run (required by Yii)&lt;br /&gt;
&lt;br /&gt;
== Recommended System ==&lt;br /&gt;
The following attributes of the hosting environment are by no means required. However, they are the same as the primary servers on which X2EngineCRM is most commonly developed and tested, and thus would be the most likely to never cause problems:&lt;br /&gt;
* PHP 5.3.2&lt;br /&gt;
* MySQL 5.5&lt;br /&gt;
* Apache 2.2&lt;br /&gt;
* Ubuntu 12.04&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
== Minimum Knowledge Requirements ==&lt;br /&gt;
Installing X2EngineCRM requires you are able to perform the following taks (and have basic knowledge of how to perform them):&lt;br /&gt;
# Upload files to a server via FTP/SFTP or otherwise, using a server-based file manager&lt;br /&gt;
# Creating a MySQL database and a database user, if they aren't available already&lt;br /&gt;
# Using a web browser, and knowing what URL to use to access a location on the server&lt;br /&gt;
&lt;br /&gt;
If you are unsure of how to perform any of these, please ask for assistance on [http://x2community.com The X2Engine Forums].&lt;br /&gt;
&lt;br /&gt;
== Installing Using The Installation Page ==&lt;br /&gt;
Installation generally proceeds as follows:&lt;br /&gt;
# Make sure a MySQL database and a database user with full permissions to that database are available from the web server.&lt;br /&gt;
# Upload the contents of the &amp;lt;tt&amp;gt;x2engine&amp;lt;/tt&amp;gt; folder to the document root of the web server, or a subdirectory if desired.&lt;br /&gt;
# Navigate to the webroot (or subdirectory) where the contents of the folder were uploaded.&lt;br /&gt;
# Fill out the installation form. Note the following:&lt;br /&gt;
#* If you leave &amp;quot;Create Sample Data&amp;quot; checked, the installer will insert fictitious contact, user, account and action records into the initial installation for testing purposes. Uncheck the box if this is not desired.&lt;br /&gt;
#* You can test the database connection without submitting the form by using the &amp;quot;Test Connection&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Using The Silent Installer == &lt;br /&gt;
It is possible to install X2EngineCRM from the command line via SSH or otherwise. This is performed as follows:&lt;br /&gt;
# There is a script in the root of the web application named &amp;lt;tt&amp;gt;installConfig.php&amp;lt;/tt&amp;gt;. Fill it with the same information that would be submitted by the installation page form, except for the variable &amp;lt;tt&amp;gt;$unique_id&amp;lt;/tt&amp;gt;; leave it as is.&lt;br /&gt;
# Change directory into the root folder of the web application.&lt;br /&gt;
# Run: &amp;lt;pre&amp;gt;php initialize.php silent&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drsimonz</name></author>	</entry>

	</feed>