2008-09-26 04:22:51 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Special ComplexTableField for editing a many_many relation.
|
2010-10-15 05:55:22 +02:00
|
|
|
*
|
|
|
|
* This field allows you to show a **many-to-many** relation with a group of
|
|
|
|
* DataObjects as a (readonly) tabular list (similiar to {@link ComplexTableField}).
|
|
|
|
* Its most useful when you want to manage the relationship itself
|
|
|
|
* thanks to the check boxes present on each line of the table.
|
|
|
|
*
|
|
|
|
* See {@link ComplexTableField} for more documentation on the base-class.
|
|
|
|
* See {@link HasManyComplexTableField} for more documentation on the relation table base-class.
|
|
|
|
*
|
|
|
|
* Note: This class relies on the fact that both sides of the relation have database tables.
|
|
|
|
* If you are only creating a class as a logical extension (that is, it doesn't have any database fields),
|
|
|
|
* then you will need to create a dummy static $db array because SilverStripe won't create a database
|
|
|
|
* table unless needed.
|
|
|
|
*
|
|
|
|
* <b>Usage</b>
|
|
|
|
*
|
|
|
|
* <code>
|
|
|
|
* $tablefield = new ManyManyComplexTableField(
|
|
|
|
* $this,
|
|
|
|
* 'MyFruits',
|
|
|
|
* 'Fruit',
|
|
|
|
* array(
|
|
|
|
* 'Name' => 'Name',
|
|
|
|
* 'Color' => 'Color'
|
|
|
|
* ),
|
|
|
|
* 'getCMSFields_forPopup'
|
|
|
|
* );
|
|
|
|
* </code>
|
|
|
|
*
|
2012-11-14 23:56:43 +01:00
|
|
|
* @deprecated 3.1 Use GridField with GridFieldConfig_RelationEditor
|
2012-03-07 12:21:25 +01:00
|
|
|
*
|
2008-09-26 04:22:51 +02:00
|
|
|
* @package forms
|
|
|
|
* @subpackage fields-relational
|
|
|
|
*/
|
|
|
|
class ManyManyComplexTableField extends HasManyComplexTableField {
|
|
|
|
|
|
|
|
private $manyManyParentClass;
|
|
|
|
|
|
|
|
public $itemClass = 'ManyManyComplexTableField_Item';
|
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
public function __construct($controller, $name, $sourceClass, $fieldList = null, $detailFormFields = null,
|
|
|
|
$sourceFilter = "", $sourceSort = "", $sourceJoin = "") {
|
2008-09-26 04:22:51 +02:00
|
|
|
|
2012-07-13 11:37:35 +02:00
|
|
|
Deprecation::notice('3.0', 'Use GridField with GridFieldConfig_RelationEditor', Deprecation::SCOPE_CLASS);
|
2012-03-07 12:21:25 +01:00
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
parent::__construct($controller, $name, $sourceClass, $fieldList, $detailFormFields,
|
|
|
|
$sourceFilter, $sourceSort, $sourceJoin);
|
2008-09-26 04:22:51 +02:00
|
|
|
|
2008-10-08 05:35:27 +02:00
|
|
|
$classes = array_reverse(ClassInfo::ancestry($this->controllerClass()));
|
2008-09-26 04:22:51 +02:00
|
|
|
foreach($classes as $class) {
|
|
|
|
$singleton = singleton($class);
|
|
|
|
$manyManyRelations = $singleton->uninherited('many_many', true);
|
|
|
|
if(isset($manyManyRelations) && array_key_exists($this->name, $manyManyRelations)) {
|
|
|
|
$this->manyManyParentClass = $class;
|
|
|
|
$manyManyTable = $class . '_' . $this->name;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
$belongsManyManyRelations = $singleton->uninherited( 'belongs_many_many', true );
|
|
|
|
if( isset( $belongsManyManyRelations ) && array_key_exists( $this->name, $belongsManyManyRelations ) ) {
|
|
|
|
$this->manyManyParentClass = $class;
|
|
|
|
$manyManyTable = $belongsManyManyRelations[$this->name] . '_' . $this->name;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$tableClasses = ClassInfo::dataClassesFor($this->sourceClass);
|
|
|
|
$source = array_shift($tableClasses);
|
|
|
|
$sourceField = $this->sourceClass;
|
|
|
|
if($this->manyManyParentClass == $sourceField)
|
|
|
|
$sourceField = 'Child';
|
|
|
|
$parentID = $this->controller->ID;
|
|
|
|
|
2012-09-26 23:34:00 +02:00
|
|
|
$this->sourceJoin .= " LEFT JOIN \"$manyManyTable\"
|
|
|
|
ON (\"$source\".\"ID\" = \"$manyManyTable\".\"{$sourceField}ID\"
|
|
|
|
AND \"{$this->manyManyParentClass}ID\" = '$parentID')";
|
2008-09-26 04:22:51 +02:00
|
|
|
|
|
|
|
$this->joinField = 'Checked';
|
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function getQuery() {
|
2009-02-02 00:49:53 +01:00
|
|
|
$query = parent::getQuery();
|
2012-05-01 06:42:14 +02:00
|
|
|
$query->selectField("CASE WHEN \"{$this->manyManyParentClass}ID\" IS NULL THEN '0' ELSE '1' END", "Checked");
|
2010-10-19 05:48:57 +02:00
|
|
|
$query->groupby[] = "\"{$this->manyManyParentClass}ID\""; // necessary for Postgres
|
|
|
|
|
2009-02-02 00:49:53 +01:00
|
|
|
return $query;
|
2008-09-26 04:22:51 +02:00
|
|
|
}
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function getParentIdName($parentClass, $childClass) {
|
2008-09-26 04:22:51 +02:00
|
|
|
return $this->getParentIdNameRelation($parentClass, $childClass, 'many_many');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* One record in a {@link ManyManyComplexTableField}.
|
|
|
|
* @package forms
|
|
|
|
* @subpackage fields-relational
|
|
|
|
*/
|
|
|
|
class ManyManyComplexTableField_Item extends ComplexTableField_Item {
|
|
|
|
|
2012-09-19 12:07:39 +02:00
|
|
|
public function MarkingCheckbox() {
|
2011-10-29 13:07:40 +02:00
|
|
|
$name = $this->parent->getName() . '[]';
|
2008-09-26 04:22:51 +02:00
|
|
|
|
|
|
|
if($this->parent->IsReadOnly)
|
2012-09-26 23:34:00 +02:00
|
|
|
return "<input class=\"checkbox\" type=\"checkbox\" name=\"$name\" value=\"{$this->item->ID}\"
|
|
|
|
disabled=\"disabled\"/>";
|
2008-09-26 04:22:51 +02:00
|
|
|
else if($this->item->{$this->parent->joinField})
|
2012-09-26 23:34:00 +02:00
|
|
|
return "<input class=\"checkbox\" type=\"checkbox\" name=\"$name\" value=\"{$this->item->ID}\"
|
|
|
|
checked=\"checked\"/>";
|
2008-09-26 04:22:51 +02:00
|
|
|
else
|
|
|
|
return "<input class=\"checkbox\" type=\"checkbox\" name=\"$name\" value=\"{$this->item->ID}\"/>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-12 21:22:11 +01:00
|
|
|
|