first import

This commit is contained in:
Bachir Soussi Chiadmi
2015-04-08 11:40:19 +02:00
commit 1bc61b12ad
8435 changed files with 1582817 additions and 0 deletions

View File

@@ -0,0 +1,146 @@
README
------
README for the custom actions effect module.
Dependencies
------------
Hard dependencies:
- Imagecache actions.
- Image (Drupal core).
Soft dependencies/recommended modules:
- Imagemagick (preferred toolkit).
- PHP filter (Drupal core).
Which toolkit?
--------------
Personally, I prefer the imagemagick toolkit:
- It is better in anti-aliasing, try to rotate an image using both toolkits and
you will see what I mean.
- It does not execute in the PHP memory space, so is not restricted by the
memory_limit PHP setting.
- The GD toolkit will, at least on my Windows configuration, keep the font file
open after a text operation, so you cannot delete, move or rename it anymore.
- This module does a better job with Imagemagick (see below).
Installing
----------
As usual. After enabling the module you can add custom actions to images.
Custom action PHP snippets
--------------------------
Given the correct permission, the custom action effect allows you to write your
own PHP snippet that does the requested processing on the image. How it can do
so, depends on the toolkit.
For all toolkits, the snippet should return true to indicate success and false
to indicate failure.
GD
--
The GD image resource is available in $image->resource. You can call the GD
functions on this resource. This effect will query the width and height after
your processing, so you don't have to change that yourself.
Imagemagick
-----------
All real image processing is done at the end, if all effects have added their
command line arguments to the $image->ops array. So your custom action should
add the imagemagick commands and its parameters by adding new string entries to
the end of that array.
If your commands change the width or height of the resulting image, you should
record so by changing $image->info['width'] and/or $image->info['height'].
General
-------
To ease your task, this effect makes some information regarding the image being
processed available in 2 variables: $image and $image_context. These variables
are readily available in your snippet.
$image is an associative array containing:
- source: string, the source of the image, e.g. public://photo.jpg
- info: array, example data:
- width (int) 180
- height (int) 180
- extension (string) png
- mime_type (string) image/png
- file_size (int) 4417
- toolkit: string, imagemagick or GD
- resource: resource. The GD image resource.
- ops: array. An array of strings with the ImageMagick commands.
$image_context is an associative array containing:
- effect_data: array, the data of this image effect, example data for the custom
action effect:
- php (string)
- managed_file: object|null. A managed file object containing these properties:
- fid (string) 2
- uid (string) 1
- filename (string) photo.jpg
- uri (string) public://photo.jpg
- filemime (string) image/jpeg
- filesize (string) 445751
- status (string) 1
- timestamp (string) 1327525851
- metatags Array [0]
- rdf_mapping Array [0]
- referring_entities: array|null. A nested array with (fully loaded) entities
referring to the current image. The 1st level of entries is keyed by the field
name, the 2nd by entity type, and the 3rd by entity id. Example data:
- field_photo Array [1]
- node Array [1]
- 12 Object of: stdClass
- nid (string) 12
- vid (string) 12
- type (string) page
- author ...
- timestamp ...
- ...
- entity: object|null, the 1st entity in referring_entities. This is for easy
access to the referring entity if it may be assumed that only 1 entity is
referring to the current image.
- image_field: array|null, the 1st image field in entity that is referring to
the current image. This is for easy access to the image field data if it may
be assumed that only 1 image field is referring to the current image. Example
data:
- fid (int) 2
- alt (string) ...
- title (string) ...
- ...
Of course there are many other possible useful globals. Think of:
- base_url
- base_path
- base_root
- is_https
- user
- language
and of course $_SERVER and $_GET.
Using these information you can access entity data as follows:
Specific case (1 entity, of known entity_type, referring to the image):
<?php
$entity_type = 'node';
$field_name = 'my_field';
$entity = $image_context['entity'];
$field = field_get_items($entity_type, $entity, $field_name);
?>
Or the more general case (not knowing the referring type, or multiple entities
that may be referring to the image):
<?php
$referring_entities = $image_context['referring_entities'];
foreach ($referring_entities as $field_name => $field_referring_entities) {
foreach ($field_referring_entities as $entity_type => $entities) {
foreach ($entities as $entity_id => $entity) {
$field = field_get_items($entity_type, $entity, $field_name);
}
}
}
?>

View File

@@ -0,0 +1,17 @@
name = Imagecache Custom Actions
description = Allow direct PHP code manipulation of imagecache images.
package = Media
core = 7.x
dependencies[] = imagecache_actions
dependencies[] = image
files[] = imagecache_customactions.install
files[] = imagecache_customactions.module
; Information added by drupal.org packaging script on 2012-12-04
version = "7.x-1.1"
core = "7.x"
project = "imagecache_actions"
datestamp = "1354653754"

View File

@@ -0,0 +1,23 @@
<?php
/**
* Rename 'text' to 'php' in custom action effect data
*/
function imagecache_customactions_update_7100(&$sandbox) {
$effects = db_select('image_effects')
->fields('image_effects')
->condition('name', 'imagecache_customactions', '=')
->execute()
->fetchAll();
foreach ($effects as $effect) {
$data = unserialize($effect->data);
if (array_key_exists('text', $data)) {
$data['php'] = $data['text'];
unset($data['text']);
$data = serialize($data);
db_update('image_effects')
->condition('ieid', $effect->ieid)
->fields(array('data' => $data))
->execute();
}
}
}

View File

@@ -0,0 +1,270 @@
<?php
/**
* @file Allow advanced users to code their own PHP image manipulation routines
* as part of imagecache processing.
*
* @author Originally contributed by crea http://drupal.org/node/325103#comment-
* 1076011
*
* @author merged into imagecache_actions by dman http://coders.co.nz
*
* Needs review - currently a security risk etc
*/
/**
* Implements hook_image_effect_info.
*
* @return array
*/
function imagecache_customactions_image_effect_info() {
$effects = array();
// @todo: implement summary theme callback
$effects['imagecache_customactions'] = array(
'label' => t('Custom action'),
'help' => t('Runs custom PHP code.'),
'effect callback' => 'imagecache_customactions_image',
'dimensions callback' => 'imagecache_customactions_dimensions',
'form callback' => 'imagecache_customactions_form',
);
$effects['imagecache_subroutine'] = array(
'label' => t('Subroutine'),
'help' => t('Runs another defined preset on the image.'),
'effect callback' => 'imagecache_subroutine_image',
'dimensions callback' => 'imagecache_subroutine_dimensions',
'form callback' => 'imagecache_subroutine_form',
);
return $effects;
}
/**
* Implements hook_image_style_flush.
*
* This hook checks if the image style that is being flushed is used in an
* subroutine effect. If so, the style that contains the subroutine effect,
* should be flushed as well as the flushed style was probably changed.
*
* @param array $flushed_style
* The image style that is being flushed.
*/
function imagecache_customactions_image_style_flush($flushed_style) {
$styles = image_styles();
foreach ($styles as $style) {
if ($style['name'] !== $flushed_style['name']) {
foreach ($style['effects'] as $effect) {
if ($effect['name'] === 'imagecache_subroutine') {
if (isset($effect['data']['subroutine_presetname']) && $effect['data']['subroutine_presetname'] === $flushed_style['name']) {
image_style_flush($style);
}
}
}
}
}
}
/**
* @deprecated replaced by summary theme callback
* Implementation of theme_hook() for imagecache_customactions.module
*/
function imagecache_customactions_theme() {
return array(
'imagecache_subroutine' => array(
'render element' => 'element',
),
);
}
/**
* Implements hook_form().
*
* @param array $data
* Array of settings for this action.
* @return array
* A form definition.
*/
function imagecache_customactions_form($data) {
// Add defaults.
$data += array('php' => 'return TRUE;');
// Note: we also need to check for the existence of the module: admin has
// all rights, so user_acccess(...) returns TRUE even if the module is not
// enabled and the permission does not exist.
$allow_dynamic = user_access('use PHP for settings') && module_exists('php');
// @todo: for imagemagick, the PHP code should add a set of commands to the
// ops aray of $image. Document this in description.
$form = array(
'php' => array(
'#type' => 'textarea',
'#rows' => 10,
'#title' => t('PHP code'),
'#default_value' => $data['php'],
'#disabled' => !$allow_dynamic,
'#description' => t("<p>A piece of PHP code that modifies the image.
It should return a boolean indicating success or failure.
You will need the '%use_php' permission, defined by the 'PHP filter' module.
See the help for an extensive explanation of the possibilities.</p>",
array('%use_php' => t('Use PHP for settings'))),
'#wysiwyg' => FALSE,
),
);
return $form;
}
/**
* Implements hook_image().
*
* @param object $image
* @param array $data
*
* @return bool
*/
function imagecache_customactions_image($image, $data) {
// Check that the PHP filter module is enabled.
$result = module_exists('php');
if ($result) {
// Get context about the image.
module_load_include('inc', 'imagecache_actions', 'utility');
$GLOBALS['image_context'] = imagecache_actions_get_image_context($image, $data);
$GLOBALS['image'] = $image;
$result = php_eval('<' . '?php global $image, $image_context; ' . $data['php'] . ' ?' . '>');
// php_eval returns '1' if the snippet returns true.
$result = $result === '1';
unset($GLOBALS['image']);
unset($GLOBALS['image_context']);
}
if ($result && $image->toolkit == 'GD') {
$image->info['width'] = imagesx($image->resource);
$image->info['height'] = imagesy($image->resource);
}
return $result;
}
/**
* Image dimensions callback; Custom action.
*
* @param array $dimensions
* Dimensions to be modified - an array with components width and height, in
* pixels.
* @param array $data
* An array with the effect options.
*/
function imagecache_customactions_dimensions(array &$dimensions, array $data) {
// @todo: add form field asking if dimensions stay the same (or if they know
// the new dimesions).
$dimensions['width'] = NULL;
$dimensions['height'] = NULL;
}
/**
* @todo change into summary theme callback
* Implementation of theme_hook() for imagecache_ui.module
*/
function theme_imagecache_customactions($element) {
// TODO: Should this theme imagecache_customactions be declared in hook_theme()?
$data = $element['#value'];
return "<em><strong>" . $data['text'] . "</strong></em>";
}
/**
* Subroutine - an imagecache action that just calls another one.
*
* Contributed by Alan D
* http://drupal.org/node/618784
*
* Reworked into customactions by dman 2010-07
*/
/**
* Config form for this preset.
*
* Implementation of imagecache_hook_form()
*
* @param array $data
* The effect data for this effect.
* @return array
* The form definition.
*/
function imagecache_subroutine_form($data) {
$data = (array) $data;
$form = array();
// List available presets
// @todo: use image_style_options and remove current style?
$presets = array();
foreach (image_styles(TRUE) as $preset) {
$presets[$preset['name']] = $preset['name'];
}
$form['subroutine_presetname'] = array(
'#type' => 'select',
'#title' => t('Preset to call'),
'#default_value' => $data['subroutine_presetname'],
'#options' => $presets,
);
return $form;
}
/**
* Actually invoke the action - which means just handing off to the named real
* preset to do the job.
*
* Implementation of hook_image()
*
* @param object $image
* @param array $data
*
* @return bool
*/
function imagecache_subroutine_image($image, $data) {
if ($preset = image_style_load($data['subroutine_presetname'])) {
foreach ($preset['effects'] as $effect) {
image_effect_apply($image, $effect);
}
}
return TRUE;
}
/**
* Image dimensions callback; Subroutine.
*
* @param array $dimensions
* Dimensions to be modified - an array with components width and height, in
* pixels.
* @param array $data
* An array with the effect options.
*/
function imagecache_subroutine_dimensions(array &$dimensions, array $data) {
// @todo: dimensions
// @todo: call dimensions callback on subroutine style.
$dimensions['width'] = NULL;
$dimensions['height'] = NULL;
}
/**
* @todo change into summary theme callback
* This lets the user see what parameters were selected for the action
*/
function theme_imagecache_subroutine($variables) {
// @todo: better decsription, do not use internal id's, imagecache_preset_by_name does not exist: fatal error?
$element = $variables['element'];
$data = $element['#value'];
if ($preset = imagecache_preset_by_name($data['subroutine_presetname'])) {
return t('%name (pid: !presetid)', array(
'%name' => $preset['presetname'],
'!presetid' => $preset['presetid']
));
}
return t('<span class="error">Invalid reference. The referenced preset may have been deleted!</span>');
}