Esempio n. 1
0
 /**
  * Add an item to this many_many relationship
  * Does so by adding an entry to the joinTable.
  * @param $extraFields A map of additional columns to insert into the joinTable
  */
 public function add($item, $extraFields = null)
 {
     if (is_numeric($item)) {
         $itemID = $item;
     } else {
         if ($item instanceof $this->dataClass) {
             $itemID = $item->ID;
         } else {
             throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR);
         }
     }
     // Validate foreignID
     if (!$this->foreignID) {
         throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING);
     }
     if ($filter = $this->foreignIDFilter()) {
         $query = new SQLQuery("*", array("\"{$this->joinTable}\""));
         $query->setWhere($filter);
         $hasExisting = $query->count() > 0;
     } else {
         $hasExisting = false;
     }
     // Insert or update
     foreach ((array) $this->foreignID as $foreignID) {
         $manipulation = array();
         if ($hasExisting) {
             $manipulation[$this->joinTable]['command'] = 'update';
             $manipulation[$this->joinTable]['where'] = "\"{$this->joinTable}\".\"{$this->foreignKey}\" = " . "'" . Convert::raw2sql($foreignID) . "'" . " AND \"{$this->localKey}\" = {$itemID}";
         } else {
             $manipulation[$this->joinTable]['command'] = 'insert';
         }
         if ($extraFields) {
             foreach ($extraFields as $k => $v) {
                 if (is_null($v)) {
                     $manipulation[$this->joinTable]['fields'][$k] = 'NULL';
                 } else {
                     $manipulation[$this->joinTable]['fields'][$k] = "'" . Convert::raw2sql($v) . "'";
                 }
             }
         }
         $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID;
         $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID;
         DB::manipulate($manipulation);
     }
 }
 /**
  *	Instantiate the appropriate link mappings, making sure they are not referencing the current live URL.
  */
 protected function checkAndCreateMappings()
 {
     $livePages = SiteTree::get()->map()->toArray();
     foreach ($this->linkMappings as $URL => $siteTreeID) {
         // Check that the destination site tree element is live.
         if (isset($livePages[$siteTreeID])) {
             // Check that the URL is not the current live URL.
             $query = new SQLQuery('ID', $this->replayTable, "FullURL = '{$URL}'");
             if ($query->count('ID') == 0) {
                 echo "<div>{$siteTreeID} - {$URL}</div><br>";
                 if ($this->live) {
                     singleton('MisdirectionService')->createPageMapping($URL, $siteTreeID);
                 }
             }
         }
     }
 }
Esempio n. 3
0
 /**
  * Add an item to this many_many relationship
  * Does so by adding an entry to the joinTable.
  *
  * @param mixed $item
  * @param array $extraFields A map of additional columns to insert into the joinTable.
  * Column names should be ANSI quoted.
  */
 public function add($item, $extraFields = array())
 {
     // Ensure nulls or empty strings are correctly treated as empty arrays
     if (empty($extraFields)) {
         $extraFields = array();
     }
     // Determine ID of new record
     if (is_numeric($item)) {
         $itemID = $item;
     } elseif ($item instanceof $this->dataClass) {
         $itemID = $item->ID;
     } else {
         throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR);
     }
     // Validate foreignID
     $foreignIDs = $this->getForeignID();
     if (empty($foreignIDs)) {
         throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING);
     }
     // Apply this item to each given foreign ID record
     if (!is_array($foreignIDs)) {
         $foreignIDs = array($foreignIDs);
     }
     foreach ($foreignIDs as $foreignID) {
         // Check for existing records for this item
         if ($foreignFilter = $this->foreignIDWriteFilter($foreignID)) {
             // With the current query, simply add the foreign and local conditions
             // The query can be a bit odd, especially if custom relation classes
             // don't join expected tables (@see Member_GroupSet for example).
             $query = new SQLQuery("*", "\"{$this->joinTable}\"");
             $query->addWhere($foreignFilter);
             $query->addWhere(array("\"{$this->joinTable}\".\"{$this->localKey}\"" => $itemID));
             $hasExisting = $query->count() > 0;
         } else {
             $hasExisting = false;
         }
         // Blank manipulation
         $manipulation = array($this->joinTable => array('command' => $hasExisting ? 'update' : 'insert', 'fields' => array()));
         if ($hasExisting) {
             $manipulation[$this->joinTable]['where'] = array("\"{$this->joinTable}\".\"{$this->foreignKey}\"" => $foreignID, "\"{$this->joinTable}\".\"{$this->localKey}\"" => $itemID);
         }
         if ($extraFields && $this->extraFields) {
             // Write extra field to manipluation in the same way
             // that DataObject::prepareManipulationTable writes fields
             foreach ($this->extraFields as $fieldName => $fieldSpec) {
                 // Skip fields without an assignment
                 if (array_key_exists($fieldName, $extraFields)) {
                     $fieldObject = Object::create_from_string($fieldSpec, $fieldName);
                     $fieldObject->setValue($extraFields[$fieldName]);
                     $fieldObject->writeToManipulation($manipulation[$this->joinTable]);
                 }
             }
         }
         $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID;
         $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID;
         DB::manipulate($manipulation);
     }
 }
 /**
  * Add an item to this many_many relationship. Does so by adding an entry
  * to the joinTable.
  *
  * @param mixed $item
  * @param array $extraFields A map of additional columns to insert into the
  *								joinTable
  */
 public function add($item, $extraFields = null)
 {
     if (is_numeric($item)) {
         $itemID = $item;
     } else {
         if ($item instanceof $this->dataClass) {
             $itemID = $item->ID;
         } else {
             throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR);
         }
     }
     $foreignIDs = $this->getForeignID();
     $foreignFilter = $this->foreignIDWriteFilter();
     // Validate foreignID
     if (!$foreignIDs) {
         throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING);
     }
     if ($foreignFilter) {
         $query = new SQLQuery("*", array("\"{$this->joinTable}\""));
         $query->setWhere($foreignFilter);
         $hasExisting = $query->count() > 0;
     } else {
         $hasExisting = false;
     }
     // Insert or update
     foreach ((array) $foreignIDs as $foreignID) {
         $manipulation = array();
         if ($hasExisting) {
             $manipulation[$this->joinTable]['command'] = 'update';
             $manipulation[$this->joinTable]['where'] = "\"{$this->joinTable}\".\"{$this->foreignKey}\" = " . "'" . Convert::raw2sql($foreignID) . "'" . " AND \"{$this->localKey}\" = {$itemID}";
         } else {
             $manipulation[$this->joinTable]['command'] = 'insert';
         }
         if ($extraFields) {
             foreach ($extraFields as $k => $v) {
                 if (is_null($v)) {
                     $manipulation[$this->joinTable]['fields'][$k] = 'NULL';
                 } else {
                     if (is_object($v) && $v instanceof DBField) {
                         // rely on writeToManipulation to manage the changes
                         // required for this field.
                         $working = array('fields' => array());
                         // create a new instance of the field so we can
                         // modify the field name to the correct version.
                         $field = DBField::create_field(get_class($v), $v);
                         $field->setName($k);
                         $field->writeToManipulation($working);
                         foreach ($working['fields'] as $extraK => $extraV) {
                             $manipulation[$this->joinTable]['fields'][$extraK] = $extraV;
                         }
                     } else {
                         $manipulation[$this->joinTable]['fields'][$k] = "'" . Convert::raw2sql($v) . "'";
                     }
                 }
             }
         }
         $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID;
         $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID;
         DB::manipulate($manipulation);
     }
 }