Оказывается, создать плагин, работающий с контентной частью Joomla, очень просто. Для этого достаточно посмотреть как устроены плагины, идущие в комплекте с установочным пакетом Joomla.
Давайте приступим непосредственно к созданию нужного нам плагина. Представьте себе что создали клиенту новый сайт на базе CMS Joomla, в котором есть раздел со статьями типа блога и у каждой статьи есть картинки, которые должны отображаться в списке статей как миниатюры (превьюшки) к этим самым статьям.
При создании и редактировании материала Joomla нам предлагает добавить к материалу минимум две картинки, не считая тех что будут находиться непосредственно в тексте статьи. Это изображения для отображения в списке материалов (категории Блога), которая должна иметь малый размер и полной версии статьи, соответственно тут картинка должна быть большой.
Все просто, не так ли? В сдали сайт клиенту, обучили его правильно наполнять сайт контентом и даже рассказали какого размера картинки и куда нужно вставлять. НО!
Но пройдет немного времени, и клиент то ли в силу своей забывчивости, то ли по ошибке иногда станет вставлять в поле с картинкой для миниатюры, изображения огромных размеров. Можно конечно восприпятствовать отображению больших картинок в оригинальном (огромном) размере в списке статей обработав их стилями CSS, но размер файла, который будет подгружаться на страницу, от этого измениться только визуально, а весить будет все те же 1мб и больше.
Можно конечно связаться с клиентом и напомнить ему о существовании Phtoshop в этот раз, и в другой раз, и еще бесчисленное количество раз, а можно просто создать плагин, который будет уменьшать изображения до нужного размера автоматически при сохранении материала.
А вот и сам плагин.
zimage_intro.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<?xml version="1.0" encoding="utf-8"?> <extension version="3.1" type="plugin" group="content"> <name>plg_content_zimage_intro</name> <author>Company Name</author> <creationDate>March 2014</creationDate> <authorEmail>your@email.com</authorEmail> <authorUrl>www.website.com</authorUrl> <version>3.0.0</version> <description>PLG_CONTENT_ZIMAGE_INTRO_XML_DESCRIPTION</description> <files> <filename plugin="zimage_intro">zimage_intro.php</filename> <filename>index.html</filename> </files> <languages> <language tag="en-GB">en-GB.plg_content_zimage_intro.ini</language> <language tag="en-GB">en-GB.plg_content_zimage_intro.sys.ini</language> </languages> <config> <fields name="params"> <fieldset name="basic"> <field name="th_height" type="text" filter="integer" label="Thumbnail Height" default="200" size="5" /> <field name="th_width" type="text" filter="integer" label="Thumbnail Width" default="200" size="5" /> <field name="categories" type="category" label="Categories" default="0" multiple="true" extension="com_content"> <option value="0">All Categories</option> </field> </fieldset> </fields> </config> </extension> |
zimage_intro.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<?php /** * @package Joomla.Plugin * @subpackage Content.joomla */ defined('_JEXEC') or die; class PlgContentZimage_intro extends JPlugin { /** * Article is passed by reference * Method is called right before the content is saved * * @param string $context The context of the content passed to the plugin (added in 1.6) * @param object $article A JTableContent object * @param boolean $isNew If the content is just about to be created * * @return boolean true if function not enabled, is in front-end or is new. Else true or * false depending on success of save function. * * @since 1.6 */ public function onContentBeforeSave($context, $article, $isNew) { // Check we are handling the frontend edit form. if ($context != 'com_content.form') { return true; } // Check this is a new article. if (!$isNew) { //return true; } $images = json_decode($article->images); //Let's check that we have an intro image set & that it actually exists if( !empty($images->image_intro) && file_exists(JPATH_SITE.'/'.$images->image_intro) ){ jimport('joomla.filesystem.file'); jimport( 'joomla.image.image' ); if (!class_exists('JFolder')){ jimport('joomla.filesystem.folder'); } //Set the paths for the photo directories $asset_dir = JPath::clean( JPATH_SITE.'/images/intro_thumbnails/' ); //Create the gallery folder if( !JFolder::exists( $asset_dir ) ){ JFolder::create( $asset_dir ); JFile::copy( JPATH_SITE.'/images/index.html', $asset_dir.'index.html'); } //Get the native file properties $native_dest = JPATH_SITE.'/'.$images->image_intro; $nativeProps = Jimage::getImageFileProperties( $native_dest ); $thumbnail_dest = JPATH_SITE.'/images/intro_thumbnails/'.JFile::getName($native_dest); if( !file_exists($thumbnail_dest) ){ //Let's only create a thumbnail version if one of the dimensions is smaller than those set in the plugin parameters if( $nativeProps->width > $this->params->get('th_width', '200') || $nativeProps->height > $this->params->get('th_height', '200') ){ //Generate thumbnail $jimage = new JImage(); $jimage->loadFile( $native_dest ); $thumbnail = $jimage->resize( $this->params->get('th_width', '200'), $this->params->get('th_height', '200'), true, JImage::SCALE_OUTSIDE ); $thumbnail->toFile( $thumbnail_dest, $nativeProps->type ); } } //Set the thumbnail as the image_intro $images->image_intro = 'images/intro_thumbnails/'.JFile::getName($native_dest); //Set the new $images object for the article $article->images = json_encode($images); } return true; } } |
Код, приведенный выше, вполне работоспособен, но не идеален и является всего-лишь отправной точкой для создания замечательного плагина, динамически создающего миниатюры для ваших статей. Стало быть Вы имеете полное право его доработать и улучшить его производительность.
Приведенный выше плагин творит свои чудеса с изображениями используя для этого событие контента onContentBeforeSave, но ничто не мешает вам поэкспериментировать с другими событиями, чтобы реализовать какой нибудь другой функционал.
События контента это очень мощный инструмент, и по сути одна из основных причин, почему автор использует при создании сайтов CMS Joomla!
Автор Matthew Mesa. Сайт автора zunostudios.com. Перевод осуществлен командой сайта Webors.in.ua
автор: Руслан Овчинников