"Опции"title", "url"не существуют. Определенные опции: ""
Я следую этому уроку:
https://sonata-project.org/bundles/block/master/doc/reference/your_first_block.html
Я могу сохранить новый блок, но когда я пытаюсь использовать remove
Кнопка, чтобы удалить блок, мои журналы показывают эту ошибку:
request.CRITICAL: Uncaught PHP Exception Symfony \ Component \ OptionsResolver \ Exception \ UndefinedOptionsException: "Параметры"title", "url"не существуют. Определенные параметры: ""." по адресу /usr/src/app/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php строка 685
Где мне нужно определить свои поля, чтобы решить эту проблему? И как бы выглядело это определение, если придерживаться рассматриваемого учебника?
====
Редактировать 1: Вот содержание моего блочного сервиса:
<?php
namespace AppBundle\Block;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\CoreBundle\Validator\ErrorElement;
use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use Sonata\BlockBundle\Block\Service\AbstractAdminBlockService;
class PatrickBlockService extends AbstractAdminBlockService
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'url' => false,
'title' => 'Insert the rss title',
'template' => '@SonataBlock/Block/block_core_rss.html.twig',
));
}
public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
{
$formMapper
->add('settings', 'sonata_type_immutable_array', array(
'keys' => array(
array('url', 'url', array('required' => false)),
array('title', 'text', array('required' => false)),
)
))
;
}
public function validateBlock(ErrorElement $errorElement, BlockInterface $block)
{
$errorElement
->with('settings.url')
->assertNotNull(array())
->assertNotBlank()
->end()
->with('settings.title')
->assertNotNull(array())
->assertNotBlank()
->assertMaxLength(array('limit' => 50))
->end()
;
}
public function execute(BlockContextInterface $blockContext, Response $response = null)
{
// merge settings
$settings = $blockContext->getSettings();
$feeds = false;
if ($settings['url']) {
$options = array(
'http' => array(
'user_agent' => 'Sonata/RSS Reader',
'timeout' => 2,
)
);
// retrieve contents with a specific stream context to avoid php errors
$content = @file_get_contents($settings['url'], false, stream_context_create($options));
if ($content) {
// generate a simple xml element
try {
$feeds = new \SimpleXMLElement($content);
$feeds = $feeds->channel->item;
} catch (\Exception $e) {
// silently fail error
}
}
}
return $this->renderResponse($blockContext->getTemplate(), array(
'feeds' => $feeds,
'block' => $blockContext->getBlock(),
'settings' => $settings
), $response);
}
}
... а вот соответствующий контент из admin.yml:
app.block.service.patrick:
class: AppBundle\Block\PatrickBlockService
arguments:
- "Patrick Block"
- "@templating"
До сих пор я пытался удалить два поля, задействованные в методе configureOptions(), и это, похоже, не имеет значения.
====
Изменить 2:
Когда я говорю "Я не могу сохранить новый блок", я имею в виду, что информация сохраняется в базе данных и доступна для последующего поиска. Тем не менее, я вижу ту же ошибку на этом этапе.
2 ответа
Сообщение об ошибке сбивает с толку в этом случае.
Здесь нужно задавать не параметры по умолчанию, а настройки по умолчанию, но поскольку и параметры, и параметры используют класс OptionsResolver, обратная связь имеет запутанную формулировку.
use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MyBlockService extends AbstractBlockService
{
public function configureSettings(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'url' => false,
'title' => 'Insert the rss title',
'template' => '@SonataBlock/Block/block_core_rss.html.twig',
));
}
}
- Мой пример использует AbstractBlockService, из которого расширяется AbstractAdminBlockService.
Для тех, кто гуглится годами позже: в итоге я разочаровался в учебнике и пошел в противоположном направлении, по сути, отказавшись от существующей логики, которую предоставляет Sonata. Вот расплывчатая версия того, что я помню, делал:
Клонировал файл в
vendor/sonata-project/block-bundle/Block/Service/RssBlockService.php
вsrc/AppBundle/Block/RssBlockService.php
обновленный
admin.yml
а такжеsonata_block.yml
соответственно.Ран
tail -f var/logs/dev.log
и поправил мойuse
заявления, чтобы исправить все оставшиеся грубые пятна.Создал новый шаблон Twig и настроил мой код для использования этого шаблона.