Fuente: https://github.com/chamilo/chamilo-lms/releases/download/v1.11.40/chamilo-1.11.40.zip sha256: 1cf4bf2cc7bae1ef1a1eff643235db1d552f78ddf4b6dd1e2d2dac9868679439 Snapshot independiente (rama huerfana); diffable vs 1.11.38. vendor incluido.
131 lines
4.1 KiB
PHP
131 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* This file is part of the Sonata Project package.
|
|
*
|
|
* (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
|
|
*
|
|
* 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 <thomas.rabaix@sonata-project.org>
|
|
*/
|
|
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',
|
|
]);
|
|
}
|
|
}
|