/** * Create and return a cloned copy of the given Field * * @param Field|Saveable $item Item to clone * @return bool|Saveable $item Returns the new clone on success, or false on failure * @throws WireException * */ public function ___clone(Saveable $item) { $item = $item->type->cloneField($item); // don't clone system flags if ($item->flags & Field::flagSystem || $item->flags & Field::flagPermanent) { $item->flags = $item->flags | Field::flagSystemOverride; if ($item->flags & Field::flagSystem) { $item->flags = $item->flags & ~Field::flagSystem; } if ($item->flags & Field::flagPermanent) { $item->flags = $item->flags & ~Field::flagPermanent; } $item->flags = $item->flags & ~Field::flagSystemOverride; } // don't clone the 'global' flag if ($item->flags & Field::flagGlobal) { $item->flags = $item->flags & ~Field::flagGlobal; } return parent::___clone($item); }
/** * Create and return a cloned copy of this template * * Note that this also clones the Fieldgroup if the template being cloned has it's own named fieldgroup. * * @param Template|Saveable $item Item to clone * @param string $name * @return bool|Saveable|Template $item Returns the new clone on success, or false on failure * */ public function ___clone(Saveable $item, $name = '') { $original = $item; $item = clone $item; if ($item->flags & Template::flagSystem) { // we want to avoid creating clones that have system flags $item->flags = $item->flags | Template::flagSystemOverride; $item->flags = $item->flags & ~Template::flagSystem; $item->flags = $item->flags & ~Template::flagSystemOverride; } $item->id = 0; // note this must be after removing system flags $fieldgroup = $item->fieldgroup; if ($fieldgroup->name == $item->name) { // if the fieldgroup and the item have the same name, we'll also clone the fieldgroup $fieldgroup = $this->wire('fieldgroups')->clone($fieldgroup, $name); $item->fieldgroup = $fieldgroup; } $item = parent::___clone($item, $name); if ($item && $item->id && !$item->altFilename) { // now that we have a clone, lets also clone the template file, if it exists $path = $this->wire('config')->paths->templates; $file = $path . $item->name . '.' . $this->wire('config')->templateExtension; if ($original->filenameExists() && is_writable($path) && !file_exists($file)) { if (copy($original->filename, $file)) { $item->filename = $file; } } } return $item; }