PHP code example of beeralex / beeralex.reviews

1. Go to this page and download the library: Download beeralex/beeralex.reviews library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

beeralex / beeralex.reviews example snippets


use Beeralex\Reviews\Services\ReviewsService;
use Beeralex\Reviews\Dto\ReviewDTO;

$service = service(ReviewsService::class);

$dto = new ReviewDTO();
$dto->userName = 'Иван Петров';
$dto->eval = 5;
$dto->review = 'Отличный товар, рекомендую!';
$dto->contactDetails = '[email protected]';
$dto->elementId = 123; // ID товара
$dto->userId = $USER->GetID() ?: null;

$result = $service->add($dto, $_FILES['files']);

if ($result->isSuccess()) {
    $elementId = $result->getData()['elementId'];
    echo "Отзыв создан с ID: {$elementId}";
} else {
    foreach ($result->getErrorMessages() as $error) {
        echo "Ошибка: {$error}\n";
    }
}

$dto = new ReviewDTO();
$dto->userName = 'А'; // Слишком короткое имя
$dto->eval = 6;       // Вне диапазона 1-5
$dto->review = 'OK';  // Слишком короткий отзыв

if (!$dto->isValid()) {
    foreach ($dto->getErrors() as $error) {
        echo $error->getMessage() . "\n";
    }
}

// Вывод:
// Имя должно быть от 2 до 100 символов
// Максимальная оценка - 5
// Отзыв должен быть от 10 до 5000 символов

use Beeralex\Reviews\Repository\ReviewsRepository;

$repo = service(ReviewsRepository::class);

$reviews = $repo->all(
    filter: [
        'IBLOCK_SECTION_ID' => 123, // ID товара
        'ACTIVE' => 'Y'
    ],
    select: [
        'ID',
        'DATE_CREATE',
        'PROPERTY_USER_NAME',
        'PROPERTY_EVAL',
        'PROPERTY_REVIEW',
    ],
    order: ['ID' => 'DESC']
);

foreach ($reviews as $review) {
    echo "{$review['PROPERTY_USER_NAME_VALUE']}: ";
    echo str_repeat('⭐', $review['PROPERTY_EVAL_VALUE']);
    echo " - {$review['PROPERTY_REVIEW_VALUE']['TEXT']}\n";
}

namespace App\Reviews\Services;

use Beeralex\Reviews\Services\ReviewCreatorService as BaseCreator;
use Beeralex\Reviews\Dto\ReviewDTO;
use Bitrix\Main\Result;

class ReviewCreatorService extends BaseCreator
{
    public function create(ReviewDTO $dto, array $files): Result
    {
        $result = parent::create($dto, $files);

        if ($result->isSuccess()) {
            $this->sendThankYouEmail($dto);
        }

        return $result;
    }

    protected function sendThankYouEmail(ReviewDTO $dto): void
    {
        \CEvent::Send('REVIEW_THANK_YOU', 's1', [
            'USER_NAME' => $dto->userName,
            'EMAIL' => $dto->contactDetails,
        ]);
    }
}

use Beeralex\Reviews\Contracts\CreatorContract;
use App\Reviews\Services\ReviewCreatorService;

return [
    'services' => [
        'value' => [
            CreatorContract::class => [
                'constructor' => static function () {
                    return new ReviewCreatorService(
                        service(FileUploaderContract::class),
                        service(ReviewsRepository::class)
                    );
                }
            ],
        ]
    ]
];

namespace App\Reviews\Services;

use Beeralex\Reviews\Services\ReviewCreatorService as BaseCreator;
use Beeralex\Reviews\Dto\ReviewDTO;
use Bitrix\Main\Result;
use Bitrix\Main\Error;

class ReviewCreatorService extends BaseCreator
{
    public function create(ReviewDTO $dto, array $files): Result
    {
        $result = new Result();

        if ($this->isSpam($dto)) {
            $result->addError(new Error('Отзыв отклонен как спам'));
            return $result;
        }

        return parent::create($dto, $files);
    }

    protected function isSpam(ReviewDTO $dto): bool
    {
        $spamWords = ['казино', 'кредит', 'займ'];
        $text = mb_strtolower($dto->review);

        foreach ($spamWords as $word) {
            if (str_contains($text, $word)) {
                return true;
            }
        }

        return false;
    }
}

namespace App\Reviews\Services;

use Beeralex\Reviews\Services\ReviewCreatorService as BaseCreator;
use Beeralex\Notification\NotificationManager;
use Beeralex\Notification\Dto\NotificationMessage;

class ReviewCreatorService extends BaseCreator
{
    public function create(ReviewDTO $dto, array $files): Result
    {
        $result = parent::create($dto, $files);

        if ($result->isSuccess()) {
            $this->notifyAdmin($dto, $result->getData()['elementId']);
        }

        return $result;
    }

    protected function notifyAdmin(ReviewDTO $dto, int $reviewId): void
    {
        $manager = new NotificationManager();

        $message = new NotificationMessage(
            eventName: 'NEW_REVIEW_MODERATION',
            fields: [
                'REVIEW_ID' => $reviewId,
                'USER_NAME' => $dto->userName,
                'RATING' => $dto->eval,
                'PRODUCT_ID' => $dto->elementId,
            ],
            userId: 1 // Администратор
        );

        $manager->notify($message);
    }
}

class ReviewListComponent extends CBitrixComponent
{
    public function executeComponent()
    {
        $repo = service(ReviewsRepository::class);

        $this->arResult['REVIEWS'] = $repo->all(
            filter: [
                'IBLOCK_SECTION_ID' => $this->arParams['PRODUCT_ID'],
                'ACTIVE' => 'Y'
            ],
            select: [
                'ID', 'DATE_CREATE',
                'PROPERTY_USER_NAME',
                'PROPERTY_EVAL',
                'PROPERTY_REVIEW',
                'PROPERTY_FILES',
            ],
            order: ['ID' => 'DESC']
        );

        // Статистика
        $evals = array_column($this->arResult['REVIEWS'], 'PROPERTY_EVAL_VALUE');
        $this->arResult['AVERAGE_RATING'] = !empty($evals) 
            ? round(array_sum($evals) / count($evals), 1) 
            : 0;
        $this->arResult['TOTAL_COUNT'] = count($this->arResult['REVIEWS']);

        $this->

// В /local/php_interface/init.php
CAgent::AddAgent(
    "\\App\\Agents\\ReviewModerationAgent::moderate();",
    "", "N", 3600 // Каждый час
);

// Класс агента
namespace App\Agents;

class ReviewModerationAgent
{
    public static function moderate(): string
    {
        $repo = service(ReviewsRepository::class);

        // Одобрить отзывы 4-5 звезд от авторизованных
        $reviews = $repo->all([
            'ACTIVE' => 'N',
            '>=PROPERTY_EVAL' => 4,
            '!PROPERTY_USER' => false,
        ]);

        foreach ($reviews as $review) {
            $repo->update($review['ID'], ['ACTIVE' => 'Y']);
        }

        return "\\App\\Agents\\ReviewModerationAgent::moderate();";
    }
}