beta / base.vote
简单的Bitrix投票包装器
1.0.3
2022-11-14 18:22 UTC
Requires
- php: >=7.2
- ext-json: *
- beta/bx.model: ^1.0
Requires (Dev)
- squizlabs/php_codesniffer: ^3.6
- vimeo/psalm: ^4.20
README
安装
composer require beta/base.vote
此包提供描述调查/投票的功能,作为Bitrix CMS投票模块的包装器进行开发。不是完整实现,缺少服务实现
- VoteServiceInterface - 用于处理调查方案(保存方案,按给定标准查询方案)
- VoteResultServiceInterface - 用于处理调查结果(保存结果,按给定标准查询结果)
用于处理调查的以下接口
- VoteSchemaInterface - 调查方案接口,包含:名称和描述。同时提供通过getProp(string $key)和setProp(string $key, $value)方法操作任意属性的机会。提供对问题的访问。
- QuestionInterface - 问题接口。包含:问题文本,是否必答标志,问题类型(任意整数,可能根据实现而变化)。提供对答案选项的访问,答案选项对任何问题都是必需的,即使是那些要求自由形式回答的问题。提供通过getProp(string $key)和setProp(string $key, $value)方法操作任意属性的机会。
- AnswerVariantInterface - 答案选项接口,包含:答案文本和答案选项类型(任意整数,可能根据实现而变化)。提供通过getProp(string $key)和setProp(string $key, $value)方法操作任意属性的机会。
用于处理调查结果的接口
- VoteResultInterface - 调查结果接口,提供对问题答案的访问。同时提供通过getProp(string $key)和setProp(string $key, $value)方法操作任意属性的机会。
- AnswerResultInterface - 问题答案接口,包含指向答案选项 - AnswerVariantInterface的链接和任意文本答案。提供通过getProp(string $key)和setProp(string $key, $value)方法操作任意属性的机会。
调查方案以树的形式构建,每个子元素都可以访问其父元素
VoteSchemaInterface <-> QuestionInterface <-> AnswerVariantInterface
调查结果
VoteResultInterface <-> AnswerResultInterface -> AnswerVariantInterface
创建调查示例
use Base\Vote\Interfaces\VoteServiceInterface; use Base\Vote\QuestionType; use Base\Vote\AnswerVariantType; use Base\Vote\VoteSchema; /** * @var VoteServiceInterface $voteService **/ $voteService = new SomeImplementationVoteService(); $newVoteSchema = VoteSchema::createNewVote('Новый опрос', 'Некоторое описание для опроса'); $question1 = $newVoteSchema->createQuestion('Что вы думаете по поводу нового API для опросов?', QuestionType::RADIO); $question1->createAnswerVariant('Ну такое...'); $question1->createAnswerVariant('Это что-то невероятное'); $question1->createAnswerVariant('Как это теперь развидеть?'); $question1->createAnswerVariant('Некоторое описание', AnswerVariantType::TEXT); $question2 = $newVoteSchema->createQuestion('Ещё один неоднозначный вопрос...', QuestionType::CHECKBOX); $question2->createAnswerVariant('Вариант 1'); $question2->createAnswerVariant('Вариант 2'); $question2->createAnswerVariant('Вариант 3'); $question2->createAnswerVariant('Вариант 4'); $result = $voteService->saveVote($newVoteSchema);
添加调查结果示例
use Base\Vote\Interfaces\VoteResultServiceInterface; use Base\Vote\Interfaces\QuestionInterface; use Base\Vote\VoteResult; /** * @var VoteServiceInterface $voteService **/ $voteService = new SomeImplementationVoteService(); /** * @var VoteServiceInterface $voteService **/ $voteResultService = new SomeImplementationVoteResultService(); $voteSchema = $voteService->getVoteSchemaById(1); $newVoteResult = new VoteResult($voteSchema); // Добавление ответа $newVoteResult->createAnswerResultByTitle( 'Планируете ли вы дополнительно обучаться профильной специальности?', 'да' ); // Добавление того же ответа другим методом $question = $voteSchema->getQuestionByTitle('Планируете ли вы дополнительно обучаться профильной специальности?'); $answerVariant = $question instanseof QuestionInterface ? $question->getAnswerVariantByTitle('да') : null; $newVoteResult->createAnswerResult($answerVariant); $result = $voteResultService->saveVoteResult($newVoteResult);