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.

Archive

Our old forums are still available as a read-only archive.

Moderators: martimiz, Sean, biapar, Willr, Ingo, simon_w

ComplexTableField Popup problem


Reply

6 Posts   2908 Views

Avatar
fordy

21 April 2008 at 7:02am Community Member, 46 Posts

I have finally got my head around creating new sections in the cms using complextablefield's but i am running into a few probs. I am getting the following error when opening the popup field on some instances.

FATAL ERROR: Form::callfieldmethod() Field 'MembersList' not found
At line 590 in /Applications/MAMP/htdocs/career/sapphire/forms/Form.php

I cant find why it is happening. Here is my code...

$section = $this->Section();
      
      if($section == 'employers') {
         $title = "<h2>Employers</h2>";
         $filter = "Group_Members.GroupID = 2";
         $sort = "Member.ID Desc";
      
      }else if ($section == 'candidates'){
         
         $title = "<h2>Candidates</h2>";
         $filter = "Group_Members.GroupID = 3";
         $sort = "Member.ID Desc";
      }
      
      $fieldList = array(
         'ID'=> 'ID',
         'FirstName' => 'First name',
         'Surname' => 'Surname',
         'Email' => 'Email',
         'Company' => 'Company',
         'City' => 'City',
         'Country' => 'Country',
         
      );
      
      $detailFields = new FieldSet();
    $detailFields->push( new TextField( 'FirstName', 'Firstname' ) );
    $detailFields->push( new TextField( 'Surname', 'Surname' ) );
    $detailFields->push( new TextField( 'Email', 'Position' ) );
      $detailFields->push( new TextField( 'Company', 'Company' ) );
      $detailFields->push( new TextField( 'Address', 'Address Line 1' ) );
      $detailFields->push( new TextField( 'Address2', 'Address Line 2' ) );
      $detailFields->push( new TextField( 'City', 'City' ) );
      $detailFields->push( new TextField( 'ZipCode', 'Zip / Postal Code' ) );
      $detailFields->push( new TextField( 'Country', 'Country' ) );
      $detailFields->push( new TextField( 'HomePhone', 'Telephone' ) );
      $detailFields->push( new TextField( 'MobilePhone', 'Mobile Phone' ) );
      $detailFields->push( new TextField( 'NumVisit', 'Number of Visits' ) );
      $detailFields->push( new TextField( 'LastVisited', 'Last Visits' ) );

      //$controller, $name, $sourceClass, $fieldList, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = ""
      
      $sourceJoin = "LEFT JOIN Group_Members ON Member.ID = Group_Members.MemberID";
      
      $tableList = new ComplexTableField($this,'MembersList', 'Member', $fieldList, $detailFields, $filter,$sort, $sourceJoin );
      
      $fields = new FieldSet(
         new HiddenField( 'ID' ),
         $tableList
      );
      
      //$actions = new FormAction( 'doForm', 'Save Me');
      
      return new Form($this, 'EditForm', $fields);

Can anyone help??

Avatar
Ingo

21 April 2008 at 8:10pm Forum Moderator, 801 Posts

hm i don't see anything wrong with this code - are you doing some conditional switching for the fields you add to the form? a CTF popup needs the full context of the form its embedded into, so you have to make sure this context is available when being triggered through a URL (as opposed to opening the form directly). can you provide a Debug::backtrace() and the URL where this error occurs?

Avatar
fordy

22 April 2008 at 4:24am Community Member, 46 Posts

Cheers Ingo,

The above code is in the EditForm() function.

$section = $this->Section(); executes:

public function Section() {
      $url = rtrim($_SERVER['REQUEST_URI'], '/');
      if(strrpos($url, '&')) {
         $url = substr($url, 0, strrpos($url, '&'));
      }
      $section = substr($url, strrpos($url, '/') + 1);
      
      if($section != 'employers' && $section != 'candidates' ) {
         $section = 'employers';
      }
      
      return $section;
   }

The backtrace is:

EmployerAdmin->EditForm()

call_user_func_array(Array,Array)
line 524 of ViewableData.php

ViewableData->cachedCall(EditForm,,)
line 565 of ViewableData.php

ViewableData->hasValue(EditForm)
line 7 of .cache.Applications.MAMP.htdocs.career.cms.templates.Includes.EmployerAdmin_right.ss

include(/Applications/MAMP/htdocs/career/silverstripe-cache/.cache.Applications.MAMP.htdocs.career.cms.templates.Includes.EmployerAdmin_right.ss)
line 190 of SSViewer.php

SSViewer->process(EmployerAdmin)
line 729 of ViewableData.php

ViewableData->renderWith(Array)
line 345 of LeftAndMain.php

LeftAndMain->Right()

call_user_func_array(Array,Array)
line 376 of ViewableData.php

ViewableData->XML_val(Right,,1)
line 96 of .cache.Applications.MAMP.htdocs.career.cms.templates.LeftAndMain.ss

include(/Applications/MAMP/htdocs/career/silverstripe-cache/.cache.Applications.MAMP.htdocs.career.cms.templates.LeftAndMain.ss)
line 190 of SSViewer.php

SSViewer->process(EmployerAdmin)
line 245 of Controller.php

Controller->defaultAction(index,Array)
line 216 of Controller.php

Controller->run(Array)
line 76 of Director.php

Director::direct(admin/careermembers/)
line 110 of main.php

Avatar
fordy

23 April 2008 at 10:12am Community Member, 46 Posts

Still stumped on this one :-(

Anyone have any ideas?

Avatar
fordy

25 April 2008 at 4:23am Community Member, 46 Posts

Got this one fixed. Not sure how but it's working.

I have run into a new problem though.

I am trying to show related data via a left join on the CTF. It is filtering with the join table but not showing. How can I do this?

Also, is there any way I can show related field data on the popup from a CTF?

Here is my latest code...

   public function EditForm() {
      
      $section = $this->Section();
      
      //$section = 'employers';
      
      if($section == 'employers') {
         $title = "<h2>Employers</h2>";
         $filter = "Group_Members.GroupID = 2";
         $sort = "Member.ID Desc";
      
      }else if ($section == 'candidates'){
         
         $title = "<h2>Candidates</h2>";
         $filter = "Group_Members.GroupID = 3";
         $sort = "Member.ID Desc";
      }
      
      $fieldList = array(
         
         'FirstName' => 'First name',
         'Surname' => 'Surname',
         'Email' => 'Email',
         'Company' => 'Company',
         'City' => 'City',
         'Country' => 'Country',
         'GroupID' => "Group"
         
      );
      
      $detailFields = new FieldSet();
      $detailFields->push( new TextField( 'ID', 'ID'));
    $detailFields->push( new TextField( 'FirstName', 'Firstname' ) );
    $detailFields->push( new TextField( 'Surname', 'Surname' ) );
    $detailFields->push( new TextField( 'Email', 'Position' ) );
    if($section == 'employers') {
       $detailFields->push( new TextField( 'Company', 'Company' ) );
    }
      $detailFields->push( new TextField( 'Address', 'Address Line 1' ) );
      $detailFields->push( new TextField( 'Address2', 'Address Line 2' ) );
      $detailFields->push( new TextField( 'City', 'City' ) );
      $detailFields->push( new TextField( 'ZipCode', 'Zip / Postal Code' ) );
      $detailFields->push( new TextField( 'Country', 'Country' ) );
      $detailFields->push( new TextField( 'HomePhone', 'Telephone' ) );
      $detailFields->push( new TextField( 'MobilePhone', 'Mobile Phone' ) );
      $detailFields->push( new TextField( 'NumVisit', 'Number of Visits' ) );
      $detailFields->push( new TextField( 'LastVisited', 'Last Visits' ) );
      $detailFields->push( new TextField( 'GroupID', 'Group ID' ) );
      
      //$detailFields->push( new ComplexTableField($this, 'MembersVacancies', 'Vacancy', array('ID', 'vTitle'),array('ID', 'vTitle') ));

      //$controller, $name, $sourceClass, $fieldList, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = ""
      
      $sourceJoin = "LEFT JOIN Group_Members ON Member.ID = Group_Members.MemberID";
      //$tableList = new ComplexTableField($this, 'VacancyList', 'Vacancy', $fieldList, $detailFields, $filter, $sort);
      $tableList = new ComplexTableField($this, 'Member', 'Member', $fieldList, $detailFields, $filter,$sort, $sourceJoin );
      
      $tableList->setPopupCaption("Add / Edit Member");
      $fields = new FieldSet(
         new HiddenField( 'ID' ),
         $tableList
      );
      
      //$actions = new FormAction( 'doForm', 'Save Me');

      return new Form($this, 'EditForm', $fields);
      
   }

Avatar
iadawn

15 October 2008 at 4:03am Community Member, 13 Posts

I am having a similar problem to this. Actually, it is pretty identical.

I need to extend the Newsletter functionality (don't ask!) and have included a NewsletterBlock class which Newsletters may have many of. So I have:

<?php
class NewsletterBlock extends DataObject {
   static $db = array(
      'Title' => 'Varchar(255)',
      'Content' => 'HTMLText',
      'ImagePosition' => "Enum( 'Left, Right', 'Left')",
   );
   
   static $has_one = array(
      'Image' => 'Image',
      'Newsletter' => 'Newsletter',
   );

   function getCMSFields() {
      $fields = new FieldSet(
         new TextField( 'Title', _t('NewsletterBlock.Title', 'Title') ),
         new HTMLEditorField( 'Content', _t('NewsletterBlock.Title', 'Content') ),
         new ImageField( 'Image', _t('NewsletterBlock.Image', 'Image') ),
         new OptionsetField('ImagePosition', _t('NewsletterBlock.Image', 'Image position'), singleton( 'NewsletterBlock' )->dbObject('Imageposition')->enumValues() )
      );

      return $fields;
   }
   
}
?>

And I made the following additions to Newsletter.php:

   static $has_many = array(
      "Recipients" => "Newsletter_Recipient",
      "SentRecipients" => "Newsletter_SentRecipient",
      "Blocks" => "NewsletterBlock",
   );

And, added the following into the getCMSFields method:

   $contentBlocks = new Tab(_t('Newsletter.ContentBlocks', 'Content Blocks'),
      $blockTable = new ComplexTableField(
         $controller = $this,
         $name = 'NewsletterBlock',
         $sourceClass = 'NewsletterBlock',
         $fieldList = array(
            'Title' => _t('Newsletter.Title','Title'),
            'Content' => _t('Newsletter.Content','Content'),
         )
      )
   ),

Trouble is when I put it all together and hit the nice big 'Add Newsletter Bloc' button in the Content Blocks tab I get the following error in the pop up:

Error is: FATAL ERROR: Form::callfieldmethod() Field 'NewsletterBlock' not found At line 633 in /Users/kevin/Sites/INSP/sapphire/forms/Form.php

I thought I would try the latest build just to see what would happen. In there I get the following error message:

I can't handle sub-URLs of a NewsletterAdmin object.

I am seriously stumped on this one, so any help would be appreciated!

Thanks

Kevin