Проблема с выводом из базы данных yii2

У меня есть в базе данных путь к файлам, которые я хочу вывести. как:

<audio src="/yii2-biblioteca/frontend/web/uploads/audio/lya1.mp3" controls type="audio/mpeg"> 

и я использую:

<?=HtmlPurifier::process($model->audio)?>

для выхода.

Я использовал то же самое для изображений, и все в порядке, это работает, но для аудио и для встраивания pdf не так много. В начале работал pdf, я кое-что изменил с помощью js, это не должно было иметь негативных последствий. Я вернул все назад, когда все было хорошо, но сейчас это не работает.

пример в формате pdf: <embed src="/yii2-biblioteca/frontend/web/uploads/pdf/dying.pdf" type="application/pdf" width="100%" height="100%" />


person ChiroV    schedule 02.09.2018    source источник
comment
что сейчас не работает?   -  person Muhammad Omer Aslam    schedule 02.09.2018
comment
Для своих изображений я использовал тот же путь в базе данных и HtmlPurifier::process в файле, чтобы получить вывод, но он не работает, и я не знаю, почему. Я возвращаюсь немного назад, потому что встраивание PDF-файла в какой-то момент работало нормально, и проблема была только со звуком. pdf сейчас тоже не работает. Я не знаю, что я делаю неправильно.   -  person ChiroV    schedule 02.09.2018
comment
что я пытаюсь понять, так это то, что HtmlPurifier удаляет некоторую часть пути или часть тегов, говоря, что это не работает, не очень помогает, что является входом для HtmlPurifier и что дает вам вывод поможет понять проблему, и, кстати, вы должны сохранить пути в константе, используя params.php файл, и только имя файла должно быть сохранено в базе данных.   -  person Muhammad Omer Aslam    schedule 02.09.2018
comment
Вы правы, это не поможет кричать, что это не работает, но я не знаю, как это описать, потому что это вообще ничего не выводит, это пусто. Я пытался использовать разные относительные пути, думая, что это может быть оттуда. Я использовал ту же процедуру для изображений, и если я зайду на свой сайт, просмотрев элементы проверки, я увижу замену HtmlPurifier::process($model-›image) на конкретный путь к изображению. Но с HtmlPurifier::process($model-›audio) для аудио и HtmlPurifier::process($model-›pdf) для pdf он пуст.   -  person ChiroV    schedule 02.09.2018
comment
Хорошо, можете ли вы добавить визуализированный вывод тега, сгенерированного HtmlPurifier, и тот, который вы ожидаете? добавьте его к своему вопросу, отредактировав   -  person Muhammad Omer Aslam    schedule 02.09.2018
comment
или вы можете добавить значение внутри $model->audio и $model->image? чтобы можно было протестировать   -  person Muhammad Omer Aslam    schedule 02.09.2018
comment
Что ж, я тупее, чем думал. Я не понимаю, что мне нужно делать. HtmlPurifier предлагает 0 вывода, он как будто не существует, его не показывают. Что я могу показать для визуализированного вывода? Я ожидаю нормальные аудиофайлы, которые воспроизводят аудио и встраивают файлы PDF, если я использую html-код/тег из базы данных непосредственно в файле, все работает нормально. Я не понял, как добавить значения в $model-›audio и $model-›pdf, я попытался, и у меня не получилось.   -  person ChiroV    schedule 02.09.2018
comment
Возможный дубликат Как разрешить элементы ‹audio› с помощью HTML Purifier ?   -  person Muhammad Omer Aslam    schedule 03.09.2018
comment
Я думаю, вы правы, это была моя вина, что я недостаточно искал. Имея pdf-файл с одним и тем же вопросом, я взял их вместе, не думая о них как о отдельных проблемах. В целом, я буду хранить в базе данных только src для тега audio. PDF-файл теперь работает, но я попробую предложенный Safe Embed и посмотрю, что произойдет. Я благодарю вас за ваше время и вашу помощь!   -  person ChiroV    schedule 03.09.2018


Ответы (1)


Оболочка Yii2 HTMLPurifier принимает второй аргумент:

echo HtmlPurifier::process($html, [
    // options go here
]);

Для <embed> вы должны иметь возможность использовать настройку HTML.SafeEmbed. :

echo HtmlPurifier::process($html, [
    'HTML.SafeEmbed' => true,
]);

К сожалению, для <audio> основной проблемой здесь является то, что HTML Purifier не поддерживает HTML5, что значительно усложнит его добавление.

Существуют предоставляемые пользователями исправления, позволяющие HTML Purifier понимать HTML5, но, насколько мне известно, , аудит не проводился, поэтому трудно сказать, как это повлияет на безопасность вашего сайта. (Возможно, HTML Purifier с пользовательскими определениями HTML5 все же лучше, чем вообще отсутствие HTML Purifier.)

Я дал несколько приблизительных инструкций о том, как сделать HTML Purifier (саму библиотеку, а не ее оболочку Yii2) осведомленной только о теге <audio> на еще один вопрос. Цитирование соответствующих частей:

Вам нужно будет взглянуть на "Настроить!" документация конечного пользователя, где рассказывается, как добавлять теги и атрибуты, о которых HTML Purifier не знает.

Процитируем наиболее яркий пример кода из связанной документации (этот код учит HTML Purifier работе с тегом <form>):

Время для некоторого кода:

$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.DefinitionID', 'enduser-customize.html tutorial');
$config->set('HTML.DefinitionRev', 1);
$config->set('Cache.DefinitionImpl', null); // remove this later!
$def = $config->getHTMLDefinition(true);
[...]
$form = $def->addElement(
    'form',   // name
    'Block',  // content set
    'Flow', // allowed children
    'Common', // attribute collection
    array( // attributes
        'action*' => 'URI',
        'method' => 'Enum#get|post',
        'name' => 'ID'
    )
);
$form->excludes = array('form' => true);

Каждый из параметров соответствует одному из заданных нами вопросов. Обратите внимание, что мы добавили звездочку в конец атрибута действия, чтобы указать, что это необходимо. Если кто-то укажет форму без этого атрибута, тег будет удален. Кроме того, дополнительная строка в конце — это специальное дополнительное объявление, которое предотвращает вложение форм друг в друга.

После того, как вы выполнили эти инструкции, чтобы ваша процедура очистки знала о <audio>, добавление тега <audio> в белый список конфигурации будет работать.

Итак, вкратце, если вы хотите очистить только <audio> тегов, не теряя их полностью, вам придется провести некоторое исследование возможностей тегов и добавить информацию в HTML Purifier.

Вы можете основывать свой код на том, что можно найти в файл HTML5Definition.php xemlock/htmlpurifier-html5, если вы не хотите работать с ним с нуля.

person pinkgothic    schedule 02.09.2018
comment
вы должны пометить его как дубликат, а не вставлять сюда содержимое предыдущих ответов - person Muhammad Omer Aslam; 03.09.2018
comment
@MuhammadOmerAslam Я не согласен, что это дубликат - он спрашивает о Yii2, «встраивании» и «аудио». Я писал об «аудио» для очистки исходного HTML. Это совпадение, а не дублирование. - person pinkgothic; 03.09.2018
comment
Спасибо за ответ! Я попробую SafeEmbed для pdf, но в данный момент я сделал что-то еще с тегом аудио. Это может быть глупо, но это работает. В базе данных я сохранил только путь src, а не весь тег, и на данный момент все в порядке. Еще раз большое спасибо за уделенное время и за ответ! - person ChiroV; 03.09.2018