Я застрял в следующей проблеме и хотел бы знать, если вы получили совет.
Редактор WYSIWYG позволяет пользователю загружать и вставлять изображения.Тем не менее, мои пользователи в основном ученые, но они не знают, как использовать HTML или даже как правильно изменять размер изображения для веб-страницы.Вот почему я автоматически изменяю размеры изображений на стороне сервера до миниатюр и полного размера.При нажатии на миниатюру откроется лайтбокс с полным изображением.
Редактор WYSIWYG выбрасывает изображения в теги <p>
, как показано ниже (см. Последний абзац):
<p>Intro Text</p>
<ul>
<li>List point 1</li>
<li>List point 2</li>
</ul>
<p>Some text before an image.
<img alt="Slide 1" src="/files/slide1.png" />
Maybe some text in between, nobody knows what the scientists are up to.
<img alt="Slide 2" src="/files/slide2.png" />
And even more text right after that.
</p>
Что бы я хотелдля этого нужно получить изображения из тегов <p>
и добавить их перед соответствующим абзацем в плавающем <div>
s:
<p>Intro Text</p>
<ul>
<li>List point 1</li>
<li>List point 2</li>
</ul>
<div class="custom">
<a href="/files/fullview/slide1.png" rel="lightbox[group][Slide 1]">
<img src="/files/thumbs/files/slide1.png" />
</a>
</div>
<div class="custom">
<a href="/files/fullview/slide2.png" rel="lightbox[group][Slide 2]">
<img src="/files/thumbs/files/slide2.png" />
</a>
</div>
<p>Some text before an image.
Maybe some text in between, nobody knows what the scientists are up to.
And even more text right after that.
</p>
Так что мне нужно сделать, чтобы получить все узлы изображенияHTML, созданный редактором, обрабатывает их, вставляет div и удаляет узлы изображения.Прочитав довольно много похожих вопросов, я что-то упускаю и не могу заставить его работать.Возможно, я все еще неправильно понимаю всю концепцию манипулирования DOM.Вот что я придумал до сих пор:
// create DOMDocument
$doc = new DOMDocument();
// load WYSIWYG html into DOMDocument
$doc->loadHTML($html_from_editor);
// create DOMXpath
$xpath = new DOMXpath($doc);
// create list of all first level DOMNodes (these are p's or ul's in most cases)
$children = $xpath->query("/");
foreach ( $children AS $child ) {
// now get all images
$cpath = new DOMXpath($child);
$images = $cpath->query('//img');
foreach ( $images AS $img ) {
// get attributes
$atts = $img->attributes;
// create replacement
$lb_div = $doc->createElement('div');
$lb_a = $doc->createElement('a');
$lb_img = $doc->createElement('img');
$lb_img->setAttribute("src", '/files/thumbs'.$atts->src);
$lb_a->setAttribute("href", '/files/fullview'.$atts->src);
$lb_a->setAttribute("rel", "lightbox[slide][".$atts->alt."]");
$lb_a->appendChild($lb_img);
$lb_div->setAttribute("class", "custom");
$lb_div->appendChild($lb_a);
$child->insertBefore($lb_div);
// remove original node
$child->removeChild($img);
}
}
Проблемы, с которыми я столкнулся:
- `$ atts` не заполняется значениями.Он содержит правильные имена атрибутов, но значения отсутствуют.
- `insertBefore` должен вызываться на родительском узле дочернего элемента, если я понял это право.Таким образом, это должно быть `$ child-> parentNode-> insertBefore ($ lb_div, $ child);` но родительский узел не определен.
- Удаление исходного тега img не работает.
Буду благодарен за любой совет, что мне не хватает.Я на правильном пути или это должно быть сделано совсем иначе?
Заранее, Пол