_name = $name; $this->_namespace = $namespace; $this->_classname = $classname; // Normalize and set the association types. if (!is_array($assocTypes)) { $assocTypes = [$assocTypes]; } $this->_assocTypes = $assocTypes; } // // Getters and Setters // /** * Get the name of the schema * * @return string */ public function getName() { return $this->_name; } /** * Get the internal namespace qualifier of the schema * * @return string */ public function getNamespace() { return $this->_namespace; } /** * Get the fully qualified class name of this schema. * * @return string */ public function getClassName() { return $this->_classname; } /** * Get the association types for PKP application objects * that can be described with this schema. * * @return array */ public function getAssocTypes() { return $this->_assocTypes; } /** * Get the properties of the meta-data schema. * * @return array an array of MetadataProperties */ public function &getProperties() { return $this->_properties; } /** * Get a property. Returns null if the property * doesn't exist. * * @return MetadataProperty */ public function &getProperty($propertyName) { assert(is_string($propertyName)); if ($this->hasProperty($propertyName)) { $property = & $this->_properties[$propertyName]; } else { $property = null; } return $property; } /** * Returns the property id with prefixed name space * for use in an external context (e.g. Forms, Templates). * * @param string $propertyName * * @return string */ public function getNamespacedPropertyId($propertyName) { $property = & $this->getProperty($propertyName); assert($property instanceof \PKP\metadata\MetadataProperty); return $this->getNamespace() . ucfirst($property->getId()); } /** * (Re-)set all properties of this meta-data schema. * * @param array $properties an array of MetadataProperties */ public function setProperties(&$properties) { // Remove the existing properties $this->_properties = []; // Insert the new properties foreach ($properties as $property) { $this->addProperty($property); } } /** * Add a property to this meta-data schema. * * @param string $name the unique name of the property within a meta-data schema (can be a property URI) * @param mixed $allowedTypes must be a scalar or an array with the supported types, default: METADATA_PROPERTY_TYPE_STRING * @param bool $translated whether the property may have various language versions, default: false * @param int $cardinality must be on of the supported cardinalities, default: METADATA_PROPERTY_CARDINALITY_ONE * @param string $displayName * @param string $validationMessage A string that can be displayed in case a user tries to set an invalid value for this property. * @param bool $mandatory Is this a mandatory property within the schema? */ public function addProperty( $name, $allowedTypes = MetadataProperty::METADATA_PROPERTY_TYPE_STRING, $translated = false, $cardinality = MetadataProperty::METADATA_PROPERTY_CARDINALITY_ONE, $displayName = null, $validationMessage = null, $mandatory = false ) { // Make sure that this property has not been added before assert(!is_null($name) && !isset($this->_properties[$name])); // Instantiate the property. $property = new MetadataProperty($name, $this->_assocTypes, $allowedTypes, $translated, $cardinality, $displayName, $validationMessage, $mandatory); // Add the property $this->_properties[$name] = & $property; } /** * Get the property names defined for this meta-data schema * * @return array an array of string values representing valid property names */ public function getPropertyNames() { return array_keys($this->_properties); } /** * Get the names of properties with a given data type. * * @param mixed $propertyType a valid property type description * * @return array an array of string values representing valid property names */ public function getPropertyNamesByType($propertyType) { assert(in_array($propertyType, MetadataProperty::getSupportedTypes())); $propertyNames = []; foreach ($this->_properties as $property) { $allowedPropertyTypes = $property->getAllowedTypes(); if (isset($allowedPropertyTypes[$propertyType])) { $propertyNames[] = $property->getName(); } } return $propertyNames; } /** * Checks whether a property exists in the meta-data schema * * @param string $propertyName * * @return bool */ public function hasProperty($propertyName) { return isset($this->_properties[$propertyName]); } } if (!PKP_STRICT_MODE) { class_alias('\PKP\metadata\MetadataSchema', '\MetadataSchema'); }