Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We're retiring the forums!

The SilverStripe forums have passed their heyday. They'll stick around, but will be read only. We'd encourage you to get involved in the community via the following channels instead:

E-Commerce Modules /

Discuss about the various e-commerce modules available:
Ecommerce, SS Shop, SilverCart and SwipeStripe
Alternatively, have a look the shared mailinglist.

Moderators: martimiz, Nicolaas, Sean, Ed, frankmullenger, biapar, Willr, Ingo, Jedateach, swaiba

Ecommerce 0.8.1 - add new member field

Go to End

6 Posts   1254 Views


Community Member, 34 Posts

16 February 2012 at 5:42pm

How do I go about adding a new field to the member account page.

I just need to add Company - so we can match orders/customers to current/existing customers - as we won't accept orders from anyone else.

I found instructions for older version, but nothing for the current version.

I eagerly look forward to hearing from somebody on this.


Community Member, 34 Posts

21 February 2012 at 3:58pm

I was really hoping to get support on this question seeing this module is supported.

I still do not know how to add the Company field to the account form.


Community Member, 34 Posts

22 February 2012 at 11:42am

It seems, I have this in mysite/_config.php

Object::add_extension('Member', 'EcommerceRole');

But it is not adding the company field to the account page.

I cannot figure out why?

I would really love it if someone could please give me some support on this? Or is Silverstripe and the e-commerce module a dead project?


Community Member, 34 Posts

23 February 2012 at 10:51am

Edited: 23/02/2012 10:52am

I solved it.

I had to add the company filed to ecommercerole.php

I have shared this in case anyone else needs to know what to do.

file didn't here is the code

 * EcommerceRole provides customisations to the {@link Member}
 * class specifically for this ecommerce module.
 * @package ecommerce
class EcommerceRole extends DataObjectDecorator {

	protected static $group_name = "Shop Customers";
		static function set_group_name($v) {self::$group_name = $v;}
		static function get_group_name(){return self::$group_name;}

	function extraStatics() {
		return array(
			'db' => array(
			    'Company' => 'Varchar(100)',
				'Address' => 'Varchar(255)',
				'AddressLine2' => 'Varchar(255)',
				'City' => 'Varchar(100)',
				'PostalCode' => 'Varchar(30)',
				'State' => 'Varchar(100)',
				'Country' => 'Varchar',
				'HomePhone' => 'Varchar(100)',
				'MobilePhone' => 'Varchar(100)',
				'Notes' => 'HTMLText'

	static function findCountryTitle($code) {
		user_error("depreciated, please use EcommerceRole::find_country_title", E_USER_NOTICE);
		return self::find_country_title($code);

	static function find_country_title($code) {
		$countries = Geoip::getCountryDropDown();
		// check if code was provided, and is found in the country array
		if($code && $countries[$code]) {
			return $countries[$code];
		} else {
			return false;

	 * Find the member's country.
	 * If there is no member logged in, try to resolve
	 * their IP address to a country.
	 * @return string Found country of member
	static function findCountry() {
		user_error("depreciated, please use EcommerceRole::find_country", E_USER_NOTICE);
		return self::find_country();
	static function find_country() {
		$member = Member::currentUser();

		if($member && $member->Country) {
			$country = $member->Country;
		} else {
			if($country = ShoppingCart::get_country())
				return $country;
			// HACK Avoid CLI tests from breaking (GeoIP gets in the way of unbiased tests!)
			// @todo Introduce a better way of disabling GeoIP as needed (Geoip::disable() ?)
			if(Director::is_cli()) {
				$country = null;
			} else {
				$country = Geoip::visitor_country();

		return $country;

	static function add_members_to_customer_group() {
		$gp = DataObject::get_one("Group", "\"Title\" = '".self::get_group_name()."'");
		if(!$gp) {
			$gp = new Group();
			$gp->Title = self::get_group_name();
			$gp->Sort = 999998;
		$allCombos = DB::query("
			SELECT \"Group_Members\".\"ID\", \"Group_Members\".\"MemberID\", \"Group_Members\".\"GroupID\"
			FROM \"Group_Members\"
			WHERE \"Group_Members\".\"GroupID\" = ".$gp->ID.";"
		//make an array of all combos
		$alreadyAdded = array();
		$alreadyAdded[-1] = -1;
		if($allCombos) {
			foreach($allCombos as $combo) {
				$alreadyAdded[$combo["MemberID"]] = $combo["MemberID"];
		$unlistedMembers = DataObject::get(
			$where = "\"Member\".\"ID\" NOT IN (".implode(",",$alreadyAdded).")",
			$sort = null,
			$join = "INNER JOIN \"Order\" ON \"Order\".\"MemberID\" = \"Member\".\"ID\""

		//add combos
		if($unlistedMembers) {
			$existingMembers = $gp->Members();
			foreach($unlistedMembers as $member) {

	 * Create a new member with given data for a new member,
	 * or merge the data into the logged in member.
	 * IMPORTANT: Before creating a new Member record, we first
	 * check that the request email address doesn't already exist.
	 * @param array $data Form request data to update the member with
	 * @return boolean|object Member object or boolean FALSE
	public static function createOrMerge($data) {
		user_error("depreciated, please use EcommerceRole::ecommerce_create_or_merge", E_USER_NOTICE);
		return self::ecommerce_create_or_merge($data);

	public static function ecommerce_create_or_merge($data) {
		// Because we are using a ConfirmedPasswordField, the password will
		// be an array of two fields
		if(isset($data['Password']) && is_array($data['Password'])) {
			$data['Password'] = $data['Password']['_Password'];
		// We need to ensure that the unique field is never overwritten
		$uniqueField = Member::get_unique_identifier_field();
		if(isset($data[$uniqueField])) {
			$SQL_unique = Convert::raw2xml($data[$uniqueField]);
			// TODO review - should $uniqueField be quoted by Member::get_unique_identifier_field() already? (this would be sapphire bug) 
			$existingUniqueMember = DataObject::get_one('Member', "\"$uniqueField\" = '{$SQL_unique}'");
			if($existingUniqueMember && $existingUniqueMember->exists()) {
				if(Member::currentUserID() != $existingUniqueMember->ID) {
					return false;
		if(!$member = Member::currentUser()) {
			$member = new Member();
		return $member;

	function updateCMSFields($fields) {
		$fields->addFieldToTab('Root.Main', new DropdownField('Country', 'Country', Geoip::getCountryDropDown()));

	 * Give the two letter code to resolve the title of the country.
	 * @param string $code Country code
	 * @return string|boolean String if country found, boolean FALSE if nothing found
	function getEcommerceFields() {
		$fields = new FieldSet(
			new HeaderField(_t('EcommerceRole.PERSONALINFORMATION','Personal Information'), 3),
			new TextField('Company', _t('EcommerceRole.COMPANY','Company')),
			new TextField('FirstName', _t('EcommerceRole.FIRSTNAME','First Name')),
			new TextField('Surname', _t('EcommerceRole.SURNAME','Surname')),
			new TextField('HomePhone', _t('EcommerceRole.HOMEPHONE','Phone')),
			new TextField('MobilePhone', _t('EcommerceRole.MOBILEPHONE','Mobile')),
			new EmailField('Email', _t('EcommerceRole.EMAIL','Email')),
			new TextField('Address', _t('EcommerceRole.ADDRESS','Address')),
			new TextField('AddressLine2', _t('EcommerceRole.ADDRESSLINE2','&nbsp;')),
			new TextField('City', _t('EcommerceRole.CITY','City')),
			new TextField('PostalCode', _t('EcommerceRole.POSTALCODE','Postal Code')),
			new DropdownField('Country', _t('EcommerceRole.COUNTRY','Country'), Geoip::getCountryDropDown(), self::find_country())
		$this->owner->extend('augmentEcommerceFields', $fields);
		return $fields;

	 * Return which member fields should be required on {@link OrderForm}
	 * and {@link ShopAccountForm}.
	 * @return array
	function getEcommerceRequiredFields() {
		$fields = array(
		$this->owner->extend('augmentEcommerceRequiredFields', $fields);
		return $fields;

	public function CountryTitle() {
		return self::find_country_title($this->owner->Country);

	//this method needs to be tested!
	public function onAfterWrite() {



Community Member, 6 Posts

15 March 2012 at 11:01pm

that's great!


Forum Moderator, 238 Posts

26 March 2012 at 4:14pm

Hi Kiwipearls,

My apologies for not answering your questions sooner. I'm not aware of a subscribe-to-all feature so that I can instantly get problems to my inbox.

I've created a tutorial/recipe in the shop module docs: