Jump to content
Wanze

Pages2Pdf

Recommended Posts

I use the module for a german page without multi language support. If I remember right you could do it with the Languagefields which processwire offers. If you need images or repeater or something else just name it with the ending of your language... e.g. if your shortname for english is en the you can name it myImage_en. Hope this will be help for you.

Share this post


Link to post
Share on other sites

hello Henning,

as I understand you correct: you mean to create more than one instance of the pdf creation button depending on the language? Mmmhh, I will try this tomorrow but this could be a possible solution.

It has to create a pdf file for each language - at the moment only on pdf-file is created (independent of the language).

Best regards jürgen

Share this post


Link to post
Share on other sites

Hi Juergen,

I'm the maintainer of the module.

You could solve it by hooking after this method and return a PDF filename that depends on the language of the current user:

https://github.com/wanze/Pages2Pdf/blob/master/Pages2Pdf.module#L454

I could make this method hookable for you. But I think supporting multilang would be a great feature for the module, I might need this myself soon.

I'll find some time this weekend to implement it. :)

My approach would be to create a new configuration option where you can select for what languages the PDFs are generated.

When requesting a download, the PDF in the language of the current user is served.

Cheers

Edit:

Could you post module related questions in the official module thread? Thanks.

I'll try to merge them ;)

Edited by Wanze
  • Like 5

Share this post


Link to post
Share on other sites

Hello Stefan,

thanks for your contribution (and the awesome module too).

Yes it would be great to get the possibility of multilanguage support. At the moment I dont need this function immediately. I am not very familiar with hooks in processwire so I will wait until an update ;)

Next time I will post it under the right section, I`ll swear :)

Thanks and best regards

Jürgen

Share this post


Link to post
Share on other sites

Hi,

I have implemented the feature and it's available in the dev branch: https://github.com/wanze/Pages2Pdf/tree/dev

If anyone has time to test it out, please do so and report any issues back here. I will merge it into the master branch after some more testing :)

How does it work?

First, you need to enable multilanguage support in the module configuration. If enabled, the module creates a PDF in the language of the current user. The same is true when downloading a PDF. If the PDFs are pre-generated when saving pages in the admin, a PDF for each language is created.

The language name is appended to the PDF filename in order to distinguish between files of different languages. In addition, if the module "LanguageSupportPageNames" is installed, the local page name is used for the filename.

At the same time I added the newest version of mPDF to the module WirePDF. As always, please check that your PDFs are still rendered correctly after updating!

Good night to everyone from Switzerland

  • Like 6

Share this post


Link to post
Share on other sites

Stefan,

this is awesome. I have updated the module and at the moment I have not detected any problems. I am still testing it further more.

Thanks so much!!!!

Share this post


Link to post
Share on other sites

Thanks for your feedback Jürgen!

I've tested myself and didn't find any bugs, so i merged into master. Meaning that v. 1.1.2 is now official ;)

As described two posts above, this version adds support for multilanguage PDF files.

Please make sure that your PDF files are still generated correctly before you update on a live site!

Cheers

  • Like 2

Share this post


Link to post
Share on other sites

Wazne - I was trying Pages2PDF for the first time after recommendations from the guys and was getting an error as follows.

 

Error: Call to a member function get() on a non-object (line 453 of /var/www/vhosts/pdf-tester.com/httpdocs/site/modules/WirePDF/Pages2Pdf.module)
This error message was shown because you are logged in as a Superuser. Error has been logged.

 

Looking at line 453 of /modules/WirePDF/Pages2PDF/ I see a reference to MultiLanguage Support.

If I check the Multilanguage support checkbox in the Module settings, my error disappears and my PDF is working.

Share this post


Link to post
Share on other sites

Hi Wanze,
thanks for the module. I use it the first time. While testing in devmode I am getting the following error:
Warning: Invalid argument supplied for foreach() in /site/modules/Pages2Pdf/Pages2Pdf.module on line 182

method                      | called from
----------------------------+-------------
Wire->__call( )             | ../Page.php
Wire->runHooks( )           | ../Wire.php
Pages2Pdf->hookDeletePDF( ) | ../Wire.php

After a quick look. Maybe something like this could help. Not tested! (Line 182)

       // Delete PDF for each language
       $languages  =(wire('modules')->isInstalled('LanguageSupport'))?wire('languages'):array(wire('user')->language);
         foreach ($languages as $language) {

Edit:
I should read preceding posts first ... Maybe you made already an update and call determineLanguage() method in hookDeletePDF(). If not you should. :)

 
 

Share this post


Link to post
Share on other sites

Hi Wanze,

thanks for the module. I use it the first time. While testing in devmode I am getting the following error:

Warning: Invalid argument supplied for foreach() in /site/modules/Pages2Pdf/Pages2Pdf.module on line 182

method                      | called from
----------------------------+-------------
Wire->__call( )             | ../Page.php
Wire->runHooks( )           | ../Wire.php
Pages2Pdf->hookDeletePDF( ) | ../Wire.php

After a quick look. Maybe something like this could help. Not tested! (Line 182)

       // Delete PDF for each language
       $languages  =(wire('modules')->isInstalled('LanguageSupport'))?wire('languages'):array(wire('user')->language);
         foreach ($languages as $language) {

Edit:

I should read preceding posts first ... Maybe you made already an update and call determineLanguage() method in hookDeletePDF(). If not you should. :)

Had something similar. I think you need to enable multi-lingual support even if you're not using it.

Share this post


Link to post
Share on other sites

Hi guys,

Thanks for reporting the problems.

You're right, the problem is that if language support is not enabled, the langauges API variable is not available. I wasn't aware of that and of course only tested when language support was enabled.  I'll push a fix this afternoon!

Cheers

  • Like 2

Share this post


Link to post
Share on other sites

The bug is fixed with the latest commits, please upgrade the module.

Thanks again for finding and posting this here :)

  • Like 2

Share this post


Link to post
Share on other sites

hey wanze, looks great and could help me a lot if i find time to code some day for what is in my head for a long time ^^

https://github.com/wanze/Pages2Pdf/blob/master/Pages2Pdf.module#L97

shouldn't it check if the user has at least viewing access for the page with the given ID because i think $pages->get(id) via API returns the page independent of its current publishing/hidden state and access?

maybe anyone could easyly change the page id and download pdfs of pages he is not allowed to see?

  • Like 2

Share this post


Link to post
Share on other sites

Hi BernhardB,

Thanks :)

shouldn't it check if the user has at least viewing access for the page with the given ID because i think $pages->get(id) via API returns the page independent of its current publishing/hidden state and access?

maybe anyone could easyly change the page id and download pdfs of pages he is not allowed to see?

You are right, thanks for mentioning this. I'll add the check!

The current system is secured that you must choose the templates allowed to generate PDF files. If a user does change the page ID and the template of the requested page is not allowed to create PDF's, nothing happens. However, if the template can generate PDFs and at the same time has restricted access, then this is a problem.

  • Like 1

Share this post


Link to post
Share on other sites

It seems like I'm to stupid to change the font. I followed the instructions for mpdf but I can only set default fonts like Helvetica, Times. The given example dejavu also don't work. I have converted an oft-font to ttf and put everything in the right place. Any hints how to change to individual fonts?

Share this post


Link to post
Share on other sites

OK. I got it. I used the switch in the wirepdf modul configuration and set it from core fonts "c" so "s". Now it works.

Share this post


Link to post
Share on other sites

Thanks for your information hheyne, glad it works!

Share this post


Link to post
Share on other sites

Hi Wanze,

is it possible to add additional / custom css files instead of change the styles.css file?

I know there is a global configuration, but is it possible in template context?

Regards

Share this post


Link to post
Share on other sites

Hi pwFoo,

It should be possible with an autoload module that hooks before Pages2Pdf::createPDF.

  1. Delete the styles.css file in /site/templates/Pages2Pdf folder, so that the module does not add styles from this file
  2. Create a new autoload module (or use an existing one) and add the following code into the init method.
// Inside an autoload module

public function init() {
  $this->addHookBefore('Pages2Pdf::createPDF', function($event) { 
    $pages2pdf = $event->object;
    $page = $event->arguments('page');
    // Set a custom css file for the template of the page where the PDF is generated
    $cssFile = wire('config')->paths->templates . 'pages2pdf/' . $page->template . '.css';
    $pages2pdf->wirePDF->set('cssFile', $cssFile); 
  });
}

I did not test this code, please report if it does work or not work :)

Cheers

  • Like 1

Share this post


Link to post
Share on other sites

Thanks!

At the moment I have no time to test it, but I'll report back then...

Make css file a module configuration isn't needed in every use case but would be nice. Any plans to change it?

Share this post


Link to post
Share on other sites

Make css file a module configuration isn't needed in every use case but would be nice. Any plans to change it?

What kind of configuration do you have in mind? There is a setting to specify the path to a css file. When it comes down to change the configuration dynamically to have multiple CSS files, it's hard to introduce a config setting that would fit everyone's needs. That's where Pws hooking system is the best solution IMO.

Share this post


Link to post
Share on other sites

Ok, should also be fine ;)

If I really need this modification I use a hook / autoload module. 

Thanks for this awesome module. It makes life easier ;) 

Share this post


Link to post
Share on other sites

@pwFoo

Report back here if you have any issue with the hook. :)

Another possibility would be to prefix your styles with the template and put everything in one CSS file, e.g.

.home.style1 {
  background-color: green;
}
.contact.style1 {
  background-color: red;
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By MoritzLost
      This is a new module that provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Beta release
      Note that I consider this a Beta release. Since the module is relatively aggressive in deleting some caches, I would advise you to install in on a test environment before using it on a live site.
      Let me know if you're getting any errors, have trouble using the module or if you have suggestions for improvement!
      In particular, can someone let me know if this module causes any problems with the ProCache module? I don't own or use it, so I can't check. As far as I can tell, ProCache uses a folder inside the cache directory to cache static pages, so my module should be able to clear the ProCache site cache as well, I'd appreciate it if someone can test that for me.
      Future plans
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory

    • By joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="optin" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="optin" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: https://github.com/blaueQuelle/privacywire/tree/master
      Download: https://github.com/blaueQuelle/privacywire/archive/master.zip
      I would love to hear your feedback 🙂
      Edit: Updated URLs to master tree of git repo
       
    • By David Karich
      Admin Page Tree Multiple Sorting
      ClassName: ProcessPageListMultipleSorting
      Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting.
      Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type:
      blog: -created, -modified, title  Installation
      Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+
      Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install"   Compatibility   I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback.     Download   PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting     I hope someone can use the module. Have fun and best regards, David
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "https://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


×
×
  • Create New...