* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Sonata\BlockBundle\Block\Service; use Sonata\AdminBundle\Form\FormMapper; use Sonata\BlockBundle\Block\BlockContextInterface; use Sonata\BlockBundle\Meta\Metadata; use Sonata\BlockBundle\Model\BlockInterface; use Sonata\CoreBundle\Validator\ErrorElement; use Sonata\Form\Type\ImmutableArrayType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\UrlType; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\OptionsResolver\OptionsResolver; /** * @final since sonata-project/block-bundle 3.0 * * @author Thomas Rabaix */ class RssBlockService extends AbstractAdminBlockService { public function configureSettings(OptionsResolver $resolver) { $resolver->setDefaults([ 'url' => false, 'title' => null, 'translation_domain' => null, 'icon' => 'fa fa-rss-square', 'class' => null, 'template' => '@SonataBlock/Block/block_core_rss.html.twig', ]); } public function buildEditForm(FormMapper $formMapper, BlockInterface $block) { $formMapper->add('settings', ImmutableArrayType::class, [ 'keys' => [ ['url', UrlType::class, [ 'required' => false, 'label' => 'form.label_url', ]], ['title', TextType::class, [ 'label' => 'form.label_title', 'required' => false, ]], ['translation_domain', TextType::class, [ 'label' => 'form.label_translation_domain', 'required' => false, ]], ['icon', TextType::class, [ 'label' => 'form.label_icon', 'required' => false, ]], ['class', TextType::class, [ 'label' => 'form.label_class', 'required' => false, ]], ], 'translation_domain' => 'SonataBlockBundle', ]); } public function validateBlock(ErrorElement $errorElement, BlockInterface $block) { $errorElement ->with('settings[url]') ->assertNotNull([]) ->assertNotBlank() ->end() ->with('settings[title]') ->assertNotNull([]) ->assertNotBlank() ->assertLength(['max' => 50]) ->end(); } public function execute(BlockContextInterface $blockContext, Response $response = null) { // merge settings $settings = $blockContext->getSettings(); $feeds = false; if ($settings['url']) { $options = [ 'http' => [ '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(), [ 'feeds' => $feeds, 'block' => $blockContext->getBlock(), 'settings' => $settings, ], $response); } public function getBlockMetadata($code = null) { return new Metadata($this->getName(), (null !== $code ? $code : $this->getName()), false, 'SonataBlockBundle', [ 'class' => 'fa fa-rss-square', ]); } }