Newscoop\Service\Implementation\ThemeManagementServiceLocal::assignArticleTypes PHP Метод

assignArticleTypes() публичный Метод

Adds new mapping in the theme xml
public assignArticleTypes ( $articleTypes, Theme $theme ) : string
$articleTypes an array of mapping new values to old ones [ oldTypeName => [ name : newTypeName, ignore : boolean, fields' : [ OldFieldName : [ name : new/oldType, parentType : existingSysType, ignore : boolean ], [...] ] ] , [...] ] parentType => existingSysType will be used for getting it's other props from db
$theme Newscoop\Entity\Theme
Результат string the generated xml
    public function assignArticleTypes($articleTypes, Theme $theme)
    {
        Validation::notEmpty($articleTypes, 'articleTypes');
        Validation::notEmpty($theme, 'theme');
        $artServ = $this->getArticleTypeService();
        $artCache = array();
        /**
         * function purpose: not to make so many calls to db
         * @param string $parentType article type name
         * @param string $fieldName field name doh
         * @return ArticleTypeField|null
         */
        $getFieldByName = function ($parentType, $fieldName) use($artServ, &$artCache) {
            if (!isset($artCache[$parentType . $fieldName])) {
                $artType = $artServ->findTypeByName($parentType);
                if ($artType) {
                    $artCache[$parentType . $fieldName] = $artServ->findFieldByName($artType, $fieldName);
                }
            }
            return $artCache[$parentType . $fieldName];
        };
        $xml = $this->loadXML($xmlFileName = $this->toFullPath($theme, $this->themeConfigFileName));
        if ($xml == NULL) {
            throw new \Exception("Unknown theme path '.{$theme->gePath}().' to assign to.");
        }
        $updatedTypes = array();
        // used to check duplicate names for types
        $safeTypeCounter = null;
        // parse the mapping array
        foreach ($articleTypes as $typeName => $type) {
            $articleXPath = '/' . self::TAG_ROOT . '/' . self::TAG_ARTICLE_TYPE . '[@' . self::ATTR_ARTICLE_TYPE_NAME . '=(\'' . $typeName . '\')]';
            $fieldNodes = $xml->xpath("{$articleXPath}/*");
            $updatedFields = array();
            // used to check duplicate names for fields and such
            $safeFieldCounter = null;
            if (count($fieldNodes)) {
                foreach ($fieldNodes as $fieldNode) {
                    if (!isset($type['fields'][(string) $fieldNode[self::ATTR_ARTICLE_TYPE_FILED_NAME]]) || !($updateField = $type['fields'][(string) $fieldNode[self::ATTR_ARTICLE_TYPE_FILED_NAME]]) || $updateField['ignore'] == true) {
                        continue;
                    }
                    $updateFieldName = $updateField['name'];
                    // checking for duplicates
                    if (isset($updatedFields[$updateFieldName])) {
                        $updateFieldName = $updateField['name'] . ++$safeFieldCounter;
                    }
                    $fieldNode[self::ATTR_ARTICLE_TYPE_FILED_NAME] = $updateFieldName;
                    $updatedFields[$updateFieldName] = true;
                    $theField = $getFieldByName($updateField['parentType'], $updateField['name']);
                    /* @var $theField ArticleTypeField */
                    if ($theField) {
                        $fieldNode[self::ATTR_ARTICLE_TYPE_FILED_LENGTH] = $theField->getLength();
                        $fieldNode[self::ATTR_ARTICLE_TYPE_FILED_TYPE] = $theField->getType();
                    }
                }
                // end foreach fieldNodes
            }
            if ($type['ignore']) {
                continue;
            }
            // set new article type node
            $typeNode = $xml->xpath($articleXPath);
            if (!($typeNode = current($typeNode))) {
                continue;
            }
            /* @var $typeNode SimpleXMLElement */
            $updateTypeName = $type['name'];
            // checking for duplicates
            if (isset($updatedTypes[$updateTypeName])) {
                $updateTypeName = $type['name'] . ++$safeTypeCounter;
            }
            $typeNode[self::ATTR_ARTICLE_TYPE_NAME] = $updateTypeName;
            $updatedTypes[$updateTypeName] = true;
        }
        // end foreach articleTypes
        return $xml->asXML($xmlFileName);
    }