Jump to content
horst

WireMailSmtp

Recommended Posts

I'm have some config problems with Wire Mail SMTP on a online website

My provider is One.com and after a online chat with the support, all my settings are correct: 

  • smtp hostname: send.one.com
  • smtp port 465
  • use SSL  yes
  • correct smtp user 
  • correct smtp password

With an email-client (Thunderbird) I get access, not with "Test settings now" of Wire Mail SMTP:

error:

  • ERROR: SMTP settings did not work
  • could not connect to the host "send.one.com": connection time out

Has anyone any idea?

Share this post


Link to post
Share on other sites

Perhaps try ports 2525 or 587 in case they work? It's worth the effort, this module + Mandrill is a superb combination. Good luck.

  • Like 1

Share this post


Link to post
Share on other sites

I'm have some config problems with Wire Mail SMTP on a online website

My provider is One.com and after a online chat with the support, all my settings are correct: 

  • smtp hostname: send.one.com
  • smtp port 465
  • use SSL  yes
  • correct smtp user 
  • correct smtp password

With an email-client (Thunderbird) I get access, not with "Test settings now" of Wire Mail SMTP:

error:

  • ERROR: SMTP settings did not work
  • could not connect to the host "send.one.com": connection time out

Has anyone any idea?

When you tried with the Thunderbird, was it on the same machine as the website is? Or the other way round: have you tried this settings and testconnection from an install on your localhost? If not, you also have to check if the server where your site is hosted has no outgoing firewall restrictions that get in your way.

If the install is on an online machine, you can use the php library here in the spoiler. I often use this for quick checks on hosting machines to see if I'm able to reach other machines, ports, services from there. It is a pure PHP lib to ping severs on specified ports with defined transports.

<?php
/*
    Author: Paul Aitken
    Creation Date: June 2003
    Contact: paul at phat-land com
    Class: Server Status
    Description: A class to check if certain service(s) are running

    Added functionality for checking via Gateways / Proxies
    by Horst Nogajski, January 2004
*/

// This code is Free for non-commercial use

class serverstatus
{
    // PUBLIC
    var $transport      = 'tcp';  // tcp udp ssl tls
    var $service;
    var $ip;
    var $port;
    var $local_ip         = 0;
    var $local_port     = 0;
    var $timeout;

    // PRIVATE
    var $errno;
    var $errstr;
    var $status;
    var $local_status     = TRUE;

    // CONSTRUCTOR: Can set Timeout
    function serverstatus($timeout=5)
    {
        $this->timeout = $timeout;
    }

    // PUBLIC: set Transport
    function set_Transport($t='tcp')
    {
        $valid = array('tcp','udp','ssl','tls','sslv2','sslv3'); // sslv3 ab PHP-5.0.2, alle anderen ab PHP-4.3.0
        if(in_array(strtolower($t),$valid))
        {
            $this->transport = $t;
        }
        else
        {
            $this->transport = 'tcp';
        }
    }

    // PUBLIC: Check Server
    function status_check($ip, $port, $service='', $local_ip=0, $local_port=0)
    {
        $this->service = $service;
        $this->ip = $ip;
        $this->port = $port;
        $this->local_ip = $local_ip;
        $this->local_port = $local_port;
        $this->local_status = TRUE;

        if($this->local_ip > 0 && $this->local_port > 0)
        {
            $this->local_status = FALSE;
            $this->check_local();
        }

        if($this->local_status)
        {
            $this->check_remote();
        }

        return $this->status;
    }

    // PUBLIC: Return Status
    function status_display($short=FALSE,$html=TRUE)
    {
        if(!$this->local_status)
        {
            // a local Gateway or Proxy which must be used is down!
            $filler = ' ';
            for($i=1;$i<10-strlen(trim($this->local_port));$i++) $filler.=' ';
            if($html)
            {
                return $short ? "-(<b>".$this->local_ip.":".$this->local_port."</b>) Gateway for ".$this->service." is <b>down</b>" : "- The local Gateway or Proxy for ".$this->service." is down, (".$this->local_ip.":".$this->local_port.")<br>\n";
            }
            else
            {
                return $short ? "- (".$this->local_ip.":".$this->local_port."){$filler}Gateway for ".$this->service." is down" : "- The local Gateway or Proxy for ".$this->service." is down, (".$this->local_ip.":".$this->local_port.")\r\n";
            }
        }
        else
        {
            $filler = ' ';
            for($i=1;$i<6-strlen(trim($this->port));$i++) $filler.=' ';
            if($this->status)
            {
                // It's TRUE (UP)
                if($html)
                {
                    return $short ? "+ (<b>".$this->port."</b>) ". $this->service." is <b>up</b>" : "+ The service <b>".$this->service."</b> is <b>up</b> and running. IP: <b>".$this->ip."</b> Port: <b>".$this->port."</b><BR>\n";
                }
                else
                {
                    return $short ? "+ UP   (".$this->port.")".$filler.$this->service : "+ The service ".$this->service." is up and running. IP: ".$this->ip." Port: ".$this->port."\r\n";
                }
            }
            else
            {
                // It's FALSE (DOWN)
                if($html)
                {
                    return $short ? "  (<b>".$this->port."</b>) ".$this->service." is <b>down</b>" : "- The service <b>".$this->service."</b> is currently <b>down</b>. IP: <b>".$this->ip."</b> Port: <b>".$this->port."</b><BR>\n";
                }
                else
                {
                    return $short ? "  DOWN (".$this->port.")".$filler.$this->service : "- The service ".$this->service." is currently down. IP: ".$this->ip." Port: ".$this->port."\r\n";
                }
            }
        }
        flush();
    }


    // PRIVATE: Check GATEWAY
    function check_local()
    {
        $this->local_status = ($sock = @fsockopen($this->transport.'://'.$this->local_ip, $this->local_port, $this->errno, $this->errstr, $this->timeout)) ? TRUE : FALSE;
        #if($sock!==FALSE) fclose($sock);
        $sock = NULL;
        unset($sock);
    }

    // PRIVATE: Check SERVER
    function check_remote()
    {
        $this->status = ($sock = @fsockopen($this->transport.'://'.$this->ip, $this->port, $this->errno, $this->errstr, $this->timeout)) ? TRUE : FALSE;
        #if($sock!==FALSE) fclose($sock);
        $sock = NULL;
        unset($sock);
    }

}



$ip = gethostbyname('send.one.com');
$port = 465;
$status = new serverstatus(20);
$status->set_Transport('ssl');  // you also can test / use: 'ssl','tls','sslv2','sslv3' 
$status->status_check($ip, $port, 'SMTP');
echo $status->status_display(false,false);
 

Share this post


Link to post
Share on other sites

My website is online, hosted by One.com, thunderbird is on my own machine

The spoiler-script  shows the message "The service SMTP is currently down. IP: adress  Port: 465". Thx horst for this excellent script. 

I had an hour chat with One.com Chat Support, where they suggested to change ports, SSL off, ...  (what I tried before).  Then I discoverd that SSL in my configuration panel was not activated.  The chat support said it must be activated, and after a few hours waiting, still the same error-messages.

thx cstevensjr, alan and horst, the search goes on

 

Share this post


Link to post
Share on other sites

If the script says the service is down, this only mean that it couldn't connect to the target server. So, when on the website server the outgoing request is blocked (firewall), this would also result in the same error message. If you have email / smtp accounts on other servers, e.g. gmail, hotmail or what ever, I suggest try to connect to them via the test script and see if it is possible.

And good luck! :)

  • Like 1

Share this post


Link to post
Share on other sites

Eureka, connection problem is solved

When a script is used for sending SMTP (One.com):

  • Server: NOT send.one.com  -> mailout.one.com
  • Port: 25
  • SSL: no
  • Authentication: no

With the 'spoiler-script' of Horst, no errors and in with my old website jusing AcyMailing (Joomla), it's also working fine now.

In Wire Mail SMTP, following error stays. I left SMTP user and SMTP is blank, but I assume that Wire Mail SMTP is always checking authentication??

  • server does not require authentication
  • ERROR: SMTP settings did not work

Share this post


Link to post
Share on other sites

I've recently moved my website to another server and now wiremailsmtp doesn't work anymore, it display this message:
 

Warning: stream_socket_enable_crypto(): Peer certificate CN=`email-smtp.eu-west-1.amazonaws.com' did not match expected CN=`52.19.6.114' in /home/sodd/public_html/site/modules/WireMailSmtp/smtp_classes/smtp.php on line 1255

any idea? thanks

Share this post


Link to post
Share on other sites

It is a certificate that doesn't match. This has not directly to do with the module but with the server (certificate). An expected IP (52.19.6.114) doesn't match.

The IP (52.19.6.114) is mapped to the hostname "ec2-52-19-6-114.eu-west-1.compute.amazonaws.com"

and the hostname (email-smtp.eu-west-1.amazonaws.com) resolves to IP "52.30.192.168".

So this is something that you need to sort out with the hosting company.

  • Like 4

Share this post


Link to post
Share on other sites

Successfully tested with PW 3.0 today! :)

  • Like 8

Share this post


Link to post
Share on other sites

A small contribution:  Add an option to have ability to use Self-Signed Certificate on a given SMTP server with WireMailSmtp and PHP >= 5.6
 
What PHP say - source : https://secure.php.net/manual/en/migration56.openssl.php
 

Stream wrappers now verify peer certificates and host names by default when using SSL/TLS.

 
 
HOWTO:
-----------
 
1) In file smtp.php, class smtp_class, we add a member variable and a small function :

/* Allow self signed certificate */
var $smtp_certificate = false;
Function AllowSelfSignedCertificate($allow = false)
{
        $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7");
        $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]);
        if($php_version<5006000)
            return;
        if($allow) {
		stream_context_set_option($this->connection, 'ssl', 'verify_peer', false);
		stream_context_set_option($this->connection, 'ssl', 'allow_self_signed', true);
	}
	else
	{
		stream_context_set_option($this->connection, 'ssl', 'verify_peer', true);
		stream_context_set_option($this->connection, 'ssl', 'allow_self_signed', false);
	}
}

 
and, in the Connect() method, call the function just in before we check for the result of stream_socket_enable_crypto :
 
Find : 

$this->OutputDebug('Starting TLS cryptograpic protocol');
				
if(!($success = stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_TLS_CLIENT)))

Replace to

$this->OutputDebug('Starting TLS cryptograpic protocol');

$this->AllowSelfSignedCertificate($this->smtp_certificate);

if(!($success = stream_socket_enable_crypto($this->connection, 1, STREAM_CRYPTO_METHOD_TLS_CLIENT))

2) In the file smtp_message.php, class smtp_message_class, add a member variable :

/* Allow Self Signed Certificate */
var $smtp_certificate = 0;

In the method StartSendingMessage() , assign the new member variable:

$this->smtp->smtp_certificate = $this->smtp_certificate;

 
3) In the file WireMailSmtpAdaptator, class hnsmtp, add a member variable :

private $smtp_certificate   = false;

and in the method set_var_val(), add a case smtp_certificate for our checkbox :
Find :

case 'smtp_ssl':
case 'smtp_start_tls':
case 'smtp_debug':
case 'smtp_html_debug':

Replace :

case 'smtp_certificate':
case 'smtp_ssl':
case 'smtp_start_tls':
case 'smtp_debug':
case 'smtp_html_debug':

In the class constructor, add :

$this->emailMessage->smtp_certificate           = $this->smtp_certificate;

4) In the WireMailSmtpConfig.php file, add a field :
 
add : 

$field = $modules->get('InputfieldCheckbox');
$field->attr('name', 'smtp_certificate');
$field->label = __('PHP >= 5.6 - Allow self signed certificate');
$field->attr('value', $data['smtp_certificate']);
$field->attr('checked', $data['smtp_certificate'] ? 'checked' : '');
$fieldset->add($field);

5) In the WireMailSmtp.module file, add a settings to the getDefaultdata() :
Find :

'valid_recipients'         => ''     // email addresses of valid recipients. String that we convert to array at runtime.

Add after (take care of comma ','):

'smtp_certificate'		   => 0		  // allow or not self signed certificate (PHP >= 5.6)

 
Result :

1455460292-capture.png

Hope it help. Sorry for my english ^_^

  • Like 6

Share this post


Link to post
Share on other sites

@flydev: many thanks for your contribution, I have added it to the module by following your perfect guidance step by step. Very Nice. So, I have not tested it because I have no server with a Self-Signed Certificate at hand. But I very likely trust someones code who is able to contribute PHP code backwards compatible from PHP 5.6 to PHP 3.0! :lol:^-^

$version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7");
  • Like 3

Share this post


Link to post
Share on other sites

Cool !  but...  I forgot the following line in step 3, class hnsmtp; In the constructor we need to add

$this->emailMessage->smtp_certificate           = $this->smtp_certificate;

I edited my previous post containing the instructions.

Nice module and thanks for the update, I tested it right now and it work like a charm!

  • Like 2

Share this post


Link to post
Share on other sites

Getting this error while sending mail and when testing settings (gmail) on dev verion 3.0.10. On localhost works fine, any idea? When uninstall wire mail smtp module, regular php wire mail works fine

SQLSTATE[HY000]: General error: 2006 MySQL

server has gone away

Share this post


Link to post
Share on other sites

Just wondering if anyone has tried this Module with MailGun?

I'm planning moving all my Mandarill App based settings to MailGun and at the moment mails are tested positive but no emails are recieved by me or even logged in my MailGun control panel.

Thanks

Share this post


Link to post
Share on other sites

Hi,

it is possible to set the WireMailSmtp config settings at runtime and send email using different settings for each user?

Thank you

Share this post


Link to post
Share on other sites

Yes you can read and write modules config data via PWs API for all modules. Please refer to the docs, or search the forum via google for something like $modules->get("WireMailSMTP")-> getConfigData(), or readConfigData() ? and ->writeConfigData($data).

Sorry, I'm on mobile and cannot provide links or exact code snippets ATM. :)

----

EDIT:

you can use this:

$data = wire('modules')->getModuleConfigData("WireMailSmtp");

// or, regarding on scope,
$data = $modules->getModuleConfigData("WireMailSmtp");

after modifying, you can write it back:

wire('modules')->saveModuleConfigData("WireMailSmtp", $data);

// or

$modules->saveModuleConfigData("WireMailSmtp", $data);

Edited by horst
added code snippets
  • Like 1

Share this post


Link to post
Share on other sites

I wonder if someone could give me an idea how to use the attachment aspect to WireMailSmtp? I am doing a simple form that allows the upload of pdf's only. I am unsure how to access the file size, type, etc. so that I can sanitize things a bit.

Thanks in advance.

Edited by kongondo
No need to start a new topic for a module that has its own support forum + have a look at page 1 of this thread

Share this post


Link to post
Share on other sites

Thanks Kongondo. By the way, page 1 doesn't answer this question (unless I am being a complete dunce!)

It does:

attachment ($filename) - add attachment file(s) - string or array()

$mail = wireMail(); 
$mail->attachment($filename); // string $filename or array $filenames

what means: you can add any single file path as a string with the attachment() method, or you can add multiple files at once with its pathes stored in an array.

Everything else, e.g. how you submit your form and / or upload the files, does not belong to WireMailSmtp. For this, you may find information and examples on php.net. :)

Edited by horst
  • Like 2

Share this post


Link to post
Share on other sites

Attachments work very well using this mailer. I'm using it to send out event photos to purchasers - nice, nice, nice. Thanks for the work on this, Horst!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Gadgetto
      Status update links (inside this thread) for SnipWire development will be always posted here:
      2019-11-15 2019-10-18 2019-08-08 2019-06-15 2019-06-02 2019-05-25 If you are interested, you can test the current state of development:
      https://github.com/gadgetto/SnipWire
      Please note that the software is not yet intended for use in a production system (alpha version).
      If you like, you can also submit feature requests and suggestions for improvement. I also accept pull requests.
      ---- INITIAL POST FROM 2019-05-25 ----
      I wanted to let you know that I am currently working on a new ProcessWire module that fully integrates the Snipcart Shopping Cart System into ProcessWire. (this is a customer project, so I had to postpone the development of my other module GroupMailer).
      The new module SnipWire offers full integration of the Snipcart Shopping Cart System into ProcessWire.
      Here are some highlights:
      simple setup with (optional) pre-installed templates, product fields, sample products (quasi a complete shop system to get started immediately) store dashboard with all data from the snipcart system (no change to the snipcart dashboard itself required) Integrated REST API for controlling and querying snipcart data webhooks to trigger events from Snipcart (new order, new customer, etc.) multi currency support self-defined/configurable tax rates etc. Development is already well advanced and I plan to release the module in the next 2-3 months.
      I'm not sure yet if this will be a "Pro" module or if it will be made available for free.
      I would be grateful for suggestions and hints!
      (please have a look at the screenshots to get an idea what I'm talking about)
       




    • By Robin S
      I have had this module sitting in a 95% complete state for a while now and have finally made the push to get it out there. Thanks to @teppo for his Hanna Code Helper module which I referred to and borrowed from during development.
      http://modules.processwire.com/modules/hanna-code-dialog/
      https://github.com/Toutouwai/HannaCodeDialog
      HannaCodeDialog
      Provides a number of enhancements for working with Hanna Code tags in CKEditor. The main enhancement is that Hanna tags in a CKEditor field may be double-clicked to edit their attributes using core ProcessWire inputfields in a modal dialog.
      Requires the Hanna Code module and >= ProcessWire v3.0.0.
      Installation
      Install the HannaCodeDialog module using any of the normal methods.
      For any CKEditor field where you want the "Insert Hanna tag" dropdown menu to appear in the CKEditor toolbar, visit the field settings and add "HannaDropdown" to the "CKEditor Toolbar" settings field.
      Module configuration
      Visit the module configuration screen to set any of the following:
      Exclude prefix: Hanna tags named with this prefix will not appear in the CKEditor toolbar dropdown menu for Hanna tag insertion. Exclude Hanna tags: Hanna tags selected here will not appear in the CKEditor toolbar dropdown menu for Hanna tag insertion. Background colour of tag widgets: you can customise the background colour used for Hanna tags in CKEditor if you like. Dialog width: in pixels Dialog height: in pixels Features
      Insert tag from toolbar dropdown menu
      Place the cursor in the CKEditor window where you want to insert your Hanna tag, then select the tag from the "Insert Hanna tag" dropdown.

      Advanced: if you want to control which tags appear in the dropdown on particular pages or templates you can hook HannaCodeDialog::getDropdownTags. See the forum support thread for examples .
      Edit tag attributes in modal dialog
      Insert a tag using the dropdown or double-click an existing tag in the CKEditor window to edit the tag attributes in a modal dialog.

      Tags are widgets
      Hanna tags that have been inserted in a CKEditor window are "widgets" - they have a background colour for easy identification, are protected from accidental editing, and can be moved within the text by drag-and-drop.

      Options for tag attributes may be defined
      You can define options for a tag attribute so that editors must choose an option rather than type text. This is useful for when only certain strings are valid for an attribute and also has the benefit of avoiding typos.
      Add a new attribute for the Hanna tag, named the same as the existing attribute you want to add options for, followed by "__options". The options themselves are defined as a string, using a pipe character as a delimiter between options. Example for an existing attribute named "vegetables":
      vegetables__options=Spinach|Pumpkin|Celery|Tomato|Brussels Sprout|Potato You can define a default for an attribute as normal. Use a pipe delimiter if defining multiple options as the default, for example:
      vegetables=Tomato|Potato Dynamic options
      Besides defining static options as above, you can use one Hanna tag to dynamically generate options for another. For instance, you could create a Hanna tag that generates options based on images that have been uploaded to the page, or the titles of children of the page.
      Your Hanna tag that generates the options should echo a string of options delimited by pipe characters (i.e. the same format as a static options string).
      You will probably want to name the Hanna tag that generates the options so that it starts with an underscore (or whatever prefix you have configured as the "exclude" prefix in the module config), to avoid it appearing as an insertable tag in the HannaCodeDialog dropdown menu.
      Example for an existing attribute named "image":
      image__options=[[_images_on_page]] And the code for the _images_on_page tag:
      <?php $image_names = array(); $image_fields = $page->fields->find('type=FieldtypeImage')->explode('name'); foreach($image_fields as $image_field) { $image_names = array_unique( array_merge($image_names, $page->$image_field->explode('name') ) ); } echo implode('|', $image_names); Choice of inputfield for attribute
      You can choose the inputfield that is used for an attribute in the dialog.
      For text attributes the supported inputfields are text (this is the default inputfield for text attributes so it isn't necessary to specify it if you want it) and textarea. Note: any manual line breaks inside a textarea are removed because these will break the CKEditor tag widget.
      Inputfields that support the selection of a single option are select (this is the default inputfield for attributes with options so it isn't necessary to specify it if you want it) and radios.
      Inputfields that support the selection of multiple options are selectmultiple, asmselect and checkboxes.
      You can also specify a checkbox inputfield - this is not for attributes with defined options but will limit an attribute to an integer value of 1 or 0.
      The names of the inputfield types are case-insensitive.
      Example for an existing attribute named "vegetables":
      vegetables__type=asmselect Descriptions and notes for inputfields
      You can add a description or notes to an attribute and these will be displayed in the dialog.
      Example for an existing attribute named "vegetables":
      vegetables__description=Please select vegetables for your soup. vegetables__notes=Pumpkin and celery is a delicious combination. Notes
      When creating or editing a Hanna tag you can view a basic cheatsheet outlining the HannaCodeDialog features relating to attributes below the "Attributes" config inputfield.
      Advanced
      Define or manipulate options in a hook
      You can hook HannaCodeDialog::prepareOptions to define or manipulate options for a Hanna tag attribute. Your Hanna tag must include a someattribute__options attribute in order for the hook to fire. The prepareOptions method receives the following arguments that can be used in your hook:
      options_string Any existing string of options you have set for the attribute attribute_name The name of the attribute the options are for tag_name The name of the Hanna tag page The page being edited If you hook after HannaCodeDialog::prepareOptions then your hook should set $event->return to an array of option values, or an associative array in the form of $value => $label.
      Build entire dialog form in a hook
      You can hook after HannaCodeDialog::buildForm to add inputfields to the dialog form. You can define options for the inputfields when you add them. Using a hook like this can be useful if you prefer to configure inputfield type/options/descriptions/notes in your IDE rather than as extra attributes in the Hanna tag settings. It's also useful if you want to use inputfield settings such as showIf.
      When you add the inputfields you must set both the name and the id of the inputfield to match the attribute name.
      You only need to set an inputfield value in the hook if you want to force the value - otherwise the current values from the tag are automatically applied.
      To use this hook you only have to define the essential attributes (the "fields" for the tag) in the Hanna Code settings and then all the other inputfield settings can be set in the hook.
      Example buildForm() hook
      The Hanna Code attributes defined for tag "meal" (a default value is defined for "vegetables"):
      vegetables=Carrot meat cooking_style comments The hook code in /site/ready.php:
      $wire->addHookAfter('HannaCodeDialog::buildForm', function(HookEvent $event) { // The Hanna tag that is being opened in the dialog $tag_name = $event->arguments(0); // Other arguments if you need them /* @var Page $edited_page */ $edited_page = $event->arguments(1); // The page open in Page Edit $current_attributes = $event->arguments(2); // The current attribute values $default_attributes = $event->arguments(3); // The default attribute values // The form rendered in the dialog /* @var InputfieldForm $form */ $form = $event->return; if($tag_name === 'meal') { $modules = $event->wire('modules'); /* @var InputfieldCheckboxes $f */ $f = $modules->InputfieldCheckboxes; $f->name = 'vegetables'; // Set name to match attribute $f->id = 'vegetables'; // Set id to match attribute $f->label = 'Vegetables'; $f->description = 'Please select some vegetables.'; $f->notes = "If you don't eat your vegetables you can't have any pudding."; $f->addOptions(['Carrot', 'Cabbage', 'Celery'], false); $form->add($f); /* @var InputfieldRadios $f */ $f = $modules->InputfieldRadios; $f->name = 'meat'; $f->id = 'meat'; $f->label = 'Meat'; $f->addOptions(['Pork', 'Beef', 'Chicken', 'Lamb'], false); $form->add($f); /* @var InputfieldSelect $f */ $f = $modules->InputfieldSelect; $f->name = 'cooking_style'; $f->id = 'cooking_style'; $f->label = 'How would you like it cooked?'; $f->addOptions(['Fried', 'Boiled', 'Baked'], false); $form->add($f); /* @var InputfieldText $f */ $f = $modules->InputfieldText; $f->name = 'comments'; $f->id = 'comments'; $f->label = 'Comments for the chef'; $f->showIf = 'cooking_style=Fried'; $form->add($f); } }); Troubleshooting
      HannaCodeDialog includes and automatically loads the third-party CKEditor plugins Line Utilities and Widget. If you have added these plugins to your CKEditor field already for some purpose and experience problems with HannaCodeDialog try deactivating those plugins from the CKEditor field settings.
    • By Robin S
      Sanitizer EasySlugger
      Allows the use of the EasySlugger library as Sanitizer methods.
      Installation
      Install the Sanitizer EasySlugger module.
      Usage
      The module adds four new sanitizer methods.
      slugger($string, $options)
      Similar to $sanitizer->pageName() - I'm not sure if there are any advantages over that method. Included because it is one of the methods offered by EasySlugger.
      $slug = $sanitizer->slugger('Lorem Ipsum'); // Result: lorem-ipsum utf8Slugger($string, $options)
      Creates slugs from non-latin alphabets.
      $slug = $sanitizer->utf8Slugger('这个用汉语怎么说'); // Result: zhe-ge-yong-han-yu-zen-me-shuo seoSlugger($string, $options)
      Augments the string before turning it into a slug. The conversions are related to numbers, currencies, email addresses and other common symbols.
      $slug = $sanitizer->seoSlugger('The price is $5.99'); // Result: the-price-is-5-dollars-99-cents See the EasySlugger readme for some more examples.
      seoUtf8Slugger($string, $options)
      A combination of utf8Slugger() and seoSlugger().
      $slug = $sanitizer->seoUtf8Slugger('价钱是 $5.99'); // Result: jia-qian-shi-5-dollars-99-cents $options argument
      Each of the methods can take an $options array as a second argument.
      separator (string): the character that separates words in the slug. Default: - unique (bool): Determines whether a random suffix is added at the end of the slug. Default: false $slug = $sanitizer->utf8Slugger('这个用汉语怎么说', ['separator' => '_', 'unique' => true]); // Result: zhe_ge_yong_han_yu_zen_me_shuo_3ad66c4  
      https://github.com/Toutouwai/SanitizerEasySlugger
      https://modules.processwire.com/modules/sanitizer-easy-slugger/
    • By Robin S
      If you've ever needed to insert links to a large number of files within CKEditor you may have found that the standard PW link modal is a somewhat slow way to do it.
      This module provides a quicker way to insert links to files on the page being edited. You can insert a link to an individual file, or insert an unordered list of links to all files on the page with a single click.
      CKEditor Link Files
      Adds a menu to CKEditor to allow the quick insertion of links to files on the page being edited.

      Features
      Hover a menu item to see the "Description" of the corresponding file (if present). Click a menu item to insert a link to the corresponding file at the current cursor position. The filename is used as the link text. If you Alt-click a menu item the file description is used as the link text (with fallback to filename if no description entered). If text is currently selected in the editor then the selected text is used as the link text. Click "* Insert links to all files *" to insert an unordered list of links to all files on the page. Also works with the Alt-click option. Menu is built via AJAX so newly uploaded files are included in the menu without the page needing to be saved. However, descriptions are not available for newly uploaded files until the page is saved. There is an option in the module config to include files from Repeater fields in the edited page. Nested Repeater fields (files inside a Repeater inside another Repeater) are not supported. Installation
      Install the CKEditor Link Files module.
      For any CKEditor field where you want the "Insert link to file" dropdown menu to appear in the CKEditor toolbar, visit the field settings and add "LinkFilesMenu" to the "CKEditor Toolbar" settings field.
       
      http://modules.processwire.com/modules/cke-link-files/
      https://github.com/Toutouwai/CkeLinkFiles
    • By David Karich
      ProcessWire InputfieldRepeaterMatrixDuplicate
      Thanks to the great ProModule "RepeaterMatrix" I have the possibility to create complex repeater items. With it I have created a quite powerful page builder. Many different content modules, with many more possible design options. The RepeaterMatrix module supports the cloning of items, but only within the same page. Now I often have the case that very design-intensive pages and items are created. If you want to use a content module on a different page (e.g. in the same design), you have to rebuild each item manually every time.
      This module extends the commercial ProModule "RepeaterMatrix" by the function to duplicate repeater items from one page to another page. The condition is that the target field is the same matrix field from which the item is duplicated. This module is currently understood as proof of concept. There are a few limitations that need to be considered. The intention of the module is that this functionality is integrated into the core of RepeaterMatrix and does not require an extra module.
      Check out the screencast
      What the module can do
      Duplicate a repeater item from one page to another No matter how complex the item is Full support for file and image fields Multilingual support Support of Min and Max settings Live synchronization of clipboard between multiple browser tabs. Copy an item and simply switch the browser tab to the target page and you will immediately see the past button Support of multiple RepeaterMatrix fields on one page Configurable which roles and fields are excluded Duplicated items are automatically pasted to the end of the target field and set to hidden status so that changes are not directly published Automatic clipboard update when other items are picked Automatically removes old clipboard data if it is not pasted within 6 hours Delete clipboard itself by clicking the selected item again Benefit: unbelievably fast workflow and content replication What the module can't do
      Before an item can be duplicated in its current version, the source page must be saved. This means that if you make changes to an item and copy this, the old saved state will be duplicated Dynamic loading is currently not possible. Means no AJAX. When pasting, the target page is saved completely No support for nested repeater items. Currently only first level items can be duplicated. Means a repeater field in a repeater field cannot be duplicated. Workaround: simply duplicate the parent item Dynamic reloading and adding of repeater items cannot be registered. Several interfaces and events from the core are missing. The initialization occurs only once after the page load event Changelog
      1.0.4
      Bug fix: Various bug fixes and improvements in live synchronization Bug fix: Items are no longer inserted when the normal save button is clicked. Only when the past button is explicitly clicked Feature: Support of multiple repeater fields in one page Feature: Support of repeater Min/Max settings Feature: Configurable roles and fields Enhancement: Improved clipboard management Enhancement: Documentation improvement Enhancement: Corrected few typos #1 1.0.3
      Feature: Live synchronization Enhancement: Load the module only in the backend Enhancement: Documentation improvement 1.0.2
      Bug fix: Various bug fixes and improvements in JS functions Enhancement: Documentation improvement Enhancement: Corrected few typos 1.0.1
      Bug fix: Various bug fixes and improvements in the duplication process 1.0.0
      Initial release Support this module
      If this module is useful for you, I am very thankful for your small donation: Donate 5,- Euro (via PayPal – or an amount of your choice. Thank you!)
      Download this module
      > Github: https://github.com/FlipZoomMedia/InputfieldRepeaterMatrixDuplicate
      > PW module directory: https://modules.processwire.com/modules/inputfield-repeater-matrix-duplicate/
×
×
  • Create New...