clickrain/stratus

Stratus集成Craft CMS

安装: 19

依赖: 1

建议者: 0

安全: 0

星标: 0

关注者: 4

分支: 0

开放问题: 0

类型:craft-plugin

1.0.3 2023-08-07 19:28 UTC

This package is auto-updated.

Last update: 2024-09-07 21:48:33 UTC


README

A plugin for syncing and displaying Stratus reviews and listing data on your Craft website

先决条件

Stratus账户

You will need an account on Stratus to use this plugin. Please visit the Stratus help center to get started.

安装

在Craft项目中安装插件

Craft插件商店

  1. 导航到Craft CMS控制面板并点击插件商店标签。
  2. 搜索Stratus并点击插件。
  3. 点击试用按钮安装插件。

Composer

  1. 导航到项目根目录并运行以下命令。

    composer require clickrain/stratus
  2. 使用Craft CLI安装插件。

    ./craft plugin/install stratus

生成API密钥和webhook密钥

  1. 导航到Stratus上的账户设置页面并点击集成标签

  2. 在Craft CMS下,点击生成密钥按钮。一个模态窗口将出现,您可以可选地提供webhook目标URL。

  3. 点击生成按钮。API密钥和webhook密钥(如果您提供了webhook目标URL)将被生成并显示。在关闭模态窗口之前,请确保将这两个值复制到安全的地方。关闭模态窗口后,您将无法检索API密钥。

配置插件

您可以通过两种方式之一配置插件。第一种是使用Craft控制面板。第二种是使用环境变量。后一种在生产环境中更推荐。

  1. 将以下环境变量添加到项目根目录中的.env文件中。
    STRATUS_API_KEY=<API Key>
    STRATUS_WEBHOOK_SECRET=whsec_<Webhook Secret>

如果您在生成API密钥时未提供webhook URL,您需要配置Craft项目以自动运行作业队列。您可能需要在config/general.php中将runQueueAutomatically设置为false以禁用它。

  1. 配置Craft项目以自动运行作业队列。您可能需要在config/general.php中将runQueueAutomatically设置为false以禁用它。
  2. 添加cron作业或计划任务以运行craft stratus/default/import

使用方法

全局访问条目或评论

{# accessing a listing by its Stratus UUID #}
craft.stratus
    .listings({uuid: 'e529a4a3ee1f3a0a47292f391cdbebe74fa72ff2'})
    .one()

{# accessing a review by its Stratus UUID #}
craft.stratus
    .reviews({uuid: 'aec1873c02ecad673af91f2af0f4daaa66fa1887'})
    .one()

根据父列表UUID访问评论

{# by parent Stratus UUID #}
craft.stratus
    .reviews({listing: 'e529a4a3ee1f3a0a47292f391cdbebe74fa72ff2'})
    .all()

通过自定义字段访问与条目关联的评论

{# asuming the field is named reviews #}
entry.reviews
    .all()
{# access reviews for the first connected listing to the provided entry #}
entry.listings
    .one()
    .reviews
    .all()

预加载

{# listings eager loading their reviews #}
craft.stratus
    .listings().with('reviews').all()

{# reviews eager loading their parent listings #}
craft.stratus
    .reviews().with('listing').all()

过滤评论

{# Get the reviews for the first listing
and eager load reviews. Also filter the
reviews to only ones that are greater
than 3 stars or recommended (facebook). #}
set reviews = entry.listings
    .with([
        ['reviews', {
            rating: [4,5],
            recommends: [true],
            content: ['not :empty:'],
        }]
    ]).one()
{# Filter reviews by platform. supported
platforms include the following

    google
    facebook
    healthgrades
    google_play_store
    apple_app_store
    yelp
    tripadvisor
    bbb
    indeed
    glassdoor
    yellow_pages
    zocdoc
    vitals
    realself
    ratemds
    webmd
    zillow

#}
craft.stratus
    .reviews({platform: 'google'})
    .all()

显示评论信息

{% set listing = entry.listings.one() %}
{% for review in listing.reviews %}
    <dl class="card p-3">
        <dt>Platform Published Date</dt>
        <dd>{{ review.platformPublishedDate|date }}</dd>
        <dt>Author</dt>
        <dd>{{ review.author }}</dd>
        <dt>Rating</dt>
        <dd>{{ review.icons.rating|raw (review.rating|default('null')) }}</dd>
        <dt>Recommends</dt>
        <dd>{{ (review.recommends|default('null')) }}</dd>
        <dt>Review Content</dt>
        <dd>{{ review.content }}</dd>
        <dt>Platform</dt>
        <dd>
            <ul>
                <li>{{review.icons.platform|raw}}</li>
                <li>{{review.platformName}}</li>
                <li>{{ review.platform }}</li>
            </ul>
        </dd>
        <dt>Reviewable</dt>
        <dd>{{ review.reviewableName }} ({{ review.reviewableType }})</dd>
        <dt>UUIDs</dt>
        <dd>
            <ul>
                <li>{{ review.stratusUuid }} (review)</li>
                <li>{{ review.stratusParentUuid }} (parent listing)</li>
            </ul>
        </dd>
        <dt>Parent Listing</dt>
        <dd>{{ review.listing }}</dd>
    </dl>
{% endfor %}

显示列表信息

{% set listing = entry.listings.one() %}
<dl class="card p-3">
    <dt>Name</dt>
    <dd>{{ listing.name }}</dd>
    <dt>Address</dt>
    <dd>{{ listing.fullAddress|raw }}</dd>
    <dt>Address Parts</dt>
    <dd>
        <ul>
            <li>{{ listing.address }}</li>
            <li>{{ listing.address2 }}</li>
            <li>{{ listing.city }}</li>
            <li>{{ listing.state }}</li>
            <li>{{ listing.zip }}</li>
        </ul>
    </dd>
    <dt>Timezone</dt>
    <dd>{{ listing.timezone }}</dd>
    <dt>Phone Number</dt>
    <dd>{{ listing.phone }}</dd>
    <dt>Type</dt>
    <dd>{{ listing.type }}</dd>
    <dt>UUIDs</dt>
    <dd>
        <ul>
            <li>{{ listing.stratusUuid }} (listing)</li>
        </ul>
    </dd>
    <dt>Associated Reviews</dt>
    <dd>
        <ul>
            {% for review in listing.reviews %}
                <li>{{review.content}} &mdash; {{ review.author }}</li>
            {% endfor %}
        </ul>
    </dd>
    <dt>Max Rating Overall</dt>
    <dd>{{ listing.maxRating }}</dd>
    <dt>Average Rating Overall</dt>
    <dd>{{ listing.avgRating }}</dd>
    <dt>Ratings by Platform</dt>
    <dd>
        {% for rating in listing.getRatings %}
            <dl class="p-2">
                <dt>Platform Name</dt>
                <dd>{{ rating.name }}</dd>
                <dt>Average for Platform</dt>
                <dd>{{ rating.avg }}</dd>
                <dt>Maximum for Platform</dt>
                <dd>{{ rating.max }}</dd>
                <dt>Individual Connection Ratings</dt>
                <dd>{{ rating.ratings|json_encode }}</dd>
            </dl>
        {% endfor %}
    </dd>

    <dt>Hours</dt>
    <dd>
        {% for dayOfTheWeek, hoursDetails in listing.hours %}
            <strong>{{ dayOfTheWeek }}:</strong>
            {% if hoursDetails.closed %}
                Closed
            {% endif %}
            {% if hoursDetails['24hr'] %}
                Open 24 hours
            {% endif %}
            {% for period in hoursDetails.periods %}
                {{ period.open }}
                {{ period.close }}
            {% endfor %}
            <br>
        {% endfor %}
    </dd>
    <dt>Holiday Hours</dt>
    <dd>
        {% for holidayHours in listing.holidayHours %}
            <strong>{{ holidayHours.name }} ({{holidayHours.date}}):</strong>
            {% if holidayHours.closed %}
                Closed
            {% endif %}
            {% if holidayHours['24hr'] %}
                Open 24 hours
            {% endif %}
            {% for period in holidayHours.periods %}
                {{ period.open }}
                {{ period.close }}
            {% endfor %}
            <br>
        {% endfor %}
    </dd>
</dl>

GraphQL

query {
    stratusListings {
        name
        type
        address
        address2
        city
        state
        zip
        phone
        timezone
        stratusUuid
        maxRating
        avgRating
        ratings
        reviews
        hours
        holidayHours
    }
}

query {
    stratusListing(uuid: "3cab7a2b49654df583d315b3274b646d3ccdda03") {
        name
        type
        address
        address2
        city
        state
        zip
        phone
        timezone
        stratusUuid
        maxRating
        avgRating
        ratings
        reviews
        hours
        holidayHours
    }
}

query {
    stratusReviews {
        content
        platform
        platformName
        rating
        recommends
        author
        platformPublishedDate
        reviewableType
        reviewableName
        stratusUuid
        stratusParentUuid
        listing
    }
}

query {
    stratusReviews(platform: "facebook") {
        platformName
        author
        content
    }
}

query {
    stratusReviews(listing: "3cab7a2b49654df583d315b3274b646d3ccdda03") {
        platformName
        author
        content
    }
}

query {
    stratusReviews(listing: "3cab7a2b49654df583d315b3274b646d3ccdda03") {
        platformName
        author
        content
    }
}

query {
    stratusReview(uuid: "023d9f6a23685b85ad22f62c01f25c82b9d81800") {
        platformName
        author
        content
    }
}