Blog Beiträge Importieren über REST API

Hallo zusammen :slight_smile:

Ist es möglich über die REST API Blogbeiträge zu importieren?

Ich habe in der Doku (REST API - Models) kein passendes Model finden können…

Hat das schonmal wer gemacht oder einen guten Rat für mich?

Liebe Grüße

Dafür müsstest du dir eine eigene API-Resource schreiben, im Standard ist das nicht voresehen.

1 Like

Danke für deine Antwort!

Gibt es eine andere relativ simple Lösung, Blogbeiträge programmiertechnisch ins System zu bekommen?
Dies muss nicht zwingend über die REST API laufen.

schließe mich der Frage an, hätte Intersse an einem Plugin / Script für den Import von Blogeinträgen in Shopware.

Das Schreiben einer eigenen Api ist nicht allzu schwer, wenn du darauf verzichten möchtest, dann musst du dir ein Script schreiben, welches die Blogeinträge direkt inklusive aller richtigen Abhängigkeiten und ohne Umwege direkt in die Datenbank von Shopware schreibt, bzw. aus dieser löscht.

Sprich:

$connect = mysqli_connect($host,$user,$pass,$db_name);  

mysqli_query("INSERT INTO s_blogs(?) (Wert1, Wert2, Wert3…) VALUES (Var1, Var2, Var3) …

 

Soweit ich das gesehen habe plant Shopware aber auch in einer der kommenden Versionen die Api um alle Backend-Funktionalitäten zu erweitern, spätestens dann sollte es klappen.

Bis dahin versuchs mal hiermit, habe ich mal schnell zusammengeworfen:

Ordnerstruktur

HyoBlogApi
 - Components
   - Api
     - Resource
       - Blog.php
 - Controllers
   - Api
     - Blog.php
 - HyoBlogApi.php
 - plugin.xml

 

HyoBlogApi.php

 'onGetBlogApiController',
            'Enlight_Controller_Front_StartDispatch' => 'onEnlightControllerFrontStartBlog'
        ];
    }

    /**
     * @return string
     */
    public function onGetBlogApiController()
    {
        return $this->getPath() . '/Controllers/Api/Blog.php';
    }

    /**
     *
     */
    public function onEnlightControllerFrontStartBlog()
    {
        $this->container->get('loader')->registerNamespace('Shopware\Components', $this->getPath() . '/Components/');
    }
}

plugin.xml

    Blog Rest Api Erweiterung
    Blog Rest Api Extension

    1.0
    PStadtfeld
    PStadtfeld
    proprietary
    

    
        Veröffentlichung
        Release

Ressource->Blog.php

getManager()->getRepository(BlogModel::class);
    }

    /**
     * Create new Blog
     *
     * @param array $params
     * @return BlogModel
     * @throws ApiException\ValidationException
     */
    public function create(array $params)
    {
        /** @var BlogModel $blog*/
        $blog = new BlogModel();

        $blog->fromArray($params);

        $violations = $this->getManager()->validate($blog);

        /**
         * Handle Violation Errors
         */
        if ($violations->count() > 0) {
            throw new ApiException\ValidationException($violations);
        }

        $this->getManager()->persist($blog);
        $this->flush();

        return $blog;
    }

    /**
     * @param int $offset
     * @param int $limit
     * @param array $criteria
     * @param array $orderBy
     * @return array
     */
    public function getList($offset = 0, $limit = 25, array $criteria = [], array $orderBy = [])
    {

// ->leftJoin('d.multiShop', 'm')
        //->addSelect('m')
        $builder = $this->getRepository()->createQueryBuilder('blog');
        $builder->select(['blog', 'tags', 'author', 'media', 'mappingMedia', 'assignedArticles', 'assignedArticlesDetail', 'attribute', 'comments'])
            ->leftJoin('blog.tags', 'tags')
            ->leftJoin('blog.author', 'author')
            ->leftJoin('blog.assignedArticles', 'assignedArticles')
            ->leftJoin('assignedArticles.mainDetail', 'assignedArticlesDetail')
            ->leftJoin('blog.media', 'mappingMedia')
            ->leftJoin('blog.attribute', 'attribute')
            ->leftJoin('blog.comments', 'comments', \Doctrine\ORM\Query\Expr\Join::WITH, 'comments.active = 1')
            ->leftJoin('mappingMedia.media', 'media')
            ->addOrderBy('comments.creationDate', 'ASC');

        $query = $builder->getQuery();
        $query->setHydrationMode($this->resultMode);

        $paginator = $this->getManager()->createPaginator($query);

        //returns the total count of the query
        $totalResult = $paginator->count();

        //returns the Dispatch data
        $dispatch = $paginator->getIterator()->getArrayCopy();

        return ['data' => $dispatch, 'total' => $totalResult];
    }

    /**
     * Get One Dispatch Information
     *
     * @param $id
     * @return mixed
     * @throws ApiException\NotFoundException
     * @throws ApiException\ParameterMissingException
     */
    public function getOne($id)
    {
        $this->checkPrivilege('read');

        if (empty($id)) {
            throw new ApiException\ParameterMissingException();
        }

        $builder = $this->getRepository()->createQueryBuilder('blog');
        $builder->select(['blog', 'tags', 'author', 'media', 'mappingMedia', 'assignedArticles', 'assignedArticlesDetail', 'attribute', 'comments'])
            ->leftJoin('blog.tags', 'tags')
            ->leftJoin('blog.author', 'author')
            ->leftJoin('blog.assignedArticles', 'assignedArticles')
            ->leftJoin('assignedArticles.mainDetail', 'assignedArticlesDetail')
            ->leftJoin('blog.media', 'mappingMedia')
            ->leftJoin('blog.attribute', 'attribute')
            ->leftJoin('blog.comments', 'comments', \Doctrine\ORM\Query\Expr\Join::WITH, 'comments.active = 1')
            ->leftJoin('mappingMedia.media', 'media')
            ->addOrderBy('comments.creationDate', 'ASC')
            ->where('blog.id = ?1')
            ->setParameter(1, $id);

        /** @var DispatchModel $blog */
        $blog = $builder->getQuery()->getOneOrNullResult($this->getResultMode());

        if (!$blog) {
            throw new ApiException\NotFoundException("Blog by id $id not found");
        }

        return $blog;
    }
}

Controller->Api->Blog.php

resource = \Shopware\Components\Api\Manager::getResource('Blog');
    }

    /**
     * GET Request on /api/Dispatch
     */
    public function indexAction()
    {
        $limit = $this->Request()->getParam('limit', 1000);
        $offset = $this->Request()->getParam('start', 0);
        $sort = $this->Request()->getParam('sort', []);
        $filter = $this->Request()->getParam('filter', []);

        $result = $this->resource->getList($offset, $limit, $filter, $sort);

        $this->View()->assign(['success' => true, 'data' => $result]);
    }

    /**
     * Get one Dispatch
     *
     * GET /api/Dispatch/{id}
     */
    public function getAction()
    {
        $id = $this->Request()->getParam('id');
        /** @var \Shopware\Models\Dispatcher\Dispatcher $dispatch */
        $dispatch = $this->resource->getOne($id);

        $this->View()->assign(['success' => true, 'data' => $dispatch]);
    }

}

 

ACHTUNG!

Die Api-Erweiterung verfügt so derzeit nur über Getter, um auch Einträge hinzufügen zu können, musst du die Setter-Methoden in der Ressource->Blog.php ergänzen. Da kann ich mich zeitlich momentan nicht durchwurschteln, sorry :wink: