BitPoet

Module: MediaLibrary

45 posts in this topic

Hello: i get an error with PW

 

Error: Using $this when not in object context (line 39 of /web/htdocs/www.xxxxxx/home/site/modules/MediaLibrary-master/ProcessMediaLibraries.module) 

pw version 3.0.27

 

Thank you

Share this post


Link to post
Share on other sites
13 hours ago, abmcr said:

Hello: i get an error with PW


Error: Using $this when not in object context (line 39 of /web/htdocs/www.xxxxxx/home/site/modules/MediaLibrary-master/ProcessMediaLibraries.module) 

pw version 3.0.27

Can you try the latest version on git? The error should be fixed with version 0.1.0.

The latest version also incorporates @tpr's fix for the count() on null problem in case someone removes one of the fields from the MediaLibrary template.

@Zeka: I'm still looking into script loading in the frontend question. Currently, it's expected behaviour for an uncoditional autoload module, but I'm of course looking to only have the script loaded when necessary. Might be a while though, as it means a lot of testing and delving through PW's frontend editing code until I know what I'm doing. :)

2 people like this

Share this post


Link to post
Share on other sites

Hi, I'm new to Processwire and being a PHP novice having a hard time mastering its many complexities. I'm trying to use MediaLibrary but am stuck with a frustrating issue. When I add a Library, the library name appears in the main site navigation - this being a page, obviously. And when I make it hidden, the library page disappears from the Media list, and also from the dropdown when I access is via CKEditor. What am I doing wrong? Your help would be appreciated.

Share this post


Link to post
Share on other sites

Hi @MaryMatlow, that's actually a question I haven't yet thought about, since the pages I use it in assembles their navigation menus through more detailed selectors. I don't know if you could exclude it from your navigation by adding a "template!=MediaLibrary" somewhere. I'll give it some thought and post back here.

1 person likes this

Share this post


Link to post
Share on other sites

BitPoet, thank you for your hint. Adding this to MarkupSimpleNavigation php file worked:

    'selector' => 'template!=MediaLibrary',

Is there a way to access the MediaLibrary through the "choose file" button through admin. This button appears when you include images field for the page.

Thanks once again for your help and a great module.

1 person likes this

Share this post


Link to post
Share on other sites
13 hours ago, MaryMatlow said:

Is there a way to access the MediaLibrary through the "choose file" button through admin. This button appears when you include images field for the page.

Do you mean this button?

imagesfield.png

MediaLibrary is meant to avoid adding files and images to every page anew. Such functionality would copy the selected file/image over to the current page, which would be the opposite. I seem to recall that there's been a module somewhere in the forum that lets you add files or images from other pages, you might try google search with site:processwire.com/talk/ to find it. It should be possible to tweak that module then to only allow MediaLibrary pages if that is your requirement.

1 person likes this

Share this post


Link to post
Share on other sites

Thank you for sharing. Now the management is lot easier.  Every Time my client click on select image they get confused about image management because "Media Library" dropdown is always closed. Is there a configuration to keep Media Library dropdown open all of time? 

Share this post


Link to post
Share on other sites
5 hours ago, Speed said:

Thank you for sharing. Now the management is lot easier.  Every Time my client click on select image they get confused about image management because "Media Library" dropdown is always closed. Is there a configuration to keep Media Library dropdown open all of time? 

Not yet, but that should be easy to add as a module config option. I'll try to get around to it this week. Stay tuned.

2 people like this

Share this post


Link to post
Share on other sites

 

7 hours ago, BitPoet said:

Not yet, but that should be easy to add as a module config option. I'll try to get around to it this week. Stay tuned.

You are amazing... Thank you.  

1 person likes this

Share this post


Link to post
Share on other sites
2 hours ago, Speed said:

You are amazing... Thank you.  

I try my best :)

Version 0.1.1 is on GitHub and should be picked up by the module repository soon.

medialibrary-collapsed-option.png

1 person likes this

Share this post


Link to post
Share on other sites

I am having an issue where it works if I put my MediaLibrarys at the top level, but if I make a Regular page Called "Media" and create them under that, it no longer works.  The drop down is just empty.

ie.   /media/people/  (People is the MediaLibrary page)

On the admin/media page it does correctly show the path as: Pages / Media

Share this post


Link to post
Share on other sites

I was able to fix my issue with this change in the MediaLibrary.module file.

Change:

public function ___getPageMediaLibraries($pg) {
		$libraries = array();
		foreach($pg->parents->and($pg) as $ppage) { 
			$libraries = array_merge($libraries, $this->getChildLibraries($ppage));
		}
		
		return $libraries;
	}

To this:

public function ___getPageMediaLibraries($pg) {
		
		$libraries = wire('pages')->find("template=MediaLibrary");
	
		return $libraries;
	}

 

Share this post


Link to post
Share on other sites

While this is a reasonable way of structuring things, it's not a case I'll cover with the module. But that's why I made getPageMediaLibraries hookable. You don't need to modify the original module code, just add a hook in site/ready.php and change the return value there.

wire()->addHookAfter("MediaLibrary::getPageMediaLibraries", null, "myCustomGetLibraries");

function myCustomGetLibraries(HookEvent $event) {
	$event->return = wire('pages')->find("template=MediaLibrary");
}

 

2 people like this

Share this post


Link to post
Share on other sites

Is there any way to handle over thousand images? The client wants all their images in one place and search would be nice too. Is there any good way to handle this with this module? Loading time is minutes now..

Share this post


Link to post
Share on other sites
On 4/3/2017 at 3:29 PM, tewdin said:

Is there any way to handle over thousand images? The client wants all their images in one place and search would be nice too. Is there any good way to handle this with this module? Loading time is minutes now..

Loading of regular pages might benefit a tiny bit from using my module, but managing images would still be prone to the same delays if you put all images into a single library (which is just a page behind the scenes). You might still be able to make use of it if you can separate images into different libraries (e.g. by categorizing them into logos, photos, product images etc.) so numbers stay manageable. Media Library uses PW's native tools (file/image fields, CKEditor pwimage plugin), and I have to admit, I haven't tested those (and my module) with a big number of images - the module is a result of an internal requirement at work, where the number tends to stay well below 100.

I'd say give it a quick try in a test system (perhaps in conjunction with the FileFieldTweaks option of @tpr's AdminOnSteroids). If you find you need something more elaborate though, @kongondo's Media Manager pro module might be worth a look.

2 people like this

Share this post


Link to post
Share on other sites
57 minutes ago, BitPoet said:

If you find you need something more elaborate though, @kongondo's Media Manager pro module might be worth a look.

+1

Or you might want to look for non PW solutions which must be integrated for sure, so that is some extra work. I've just read about this one the other day: http://www.responsivefilemanager.com/  

1 person likes this

Share this post


Link to post
Share on other sites
On 4/4/2017 at 1:09 PM, szabesz said:

+1

Or you might want to look for non PW solutions which must be integrated for sure, so that is some extra work. I've just read about this one the other day: http://www.responsivefilemanager.com/  

I am new to ProcessWire and considering using it for a project. PW seems perfect for this project and so far I am very impressed with it. There will be several image galleries though that have hundreds of images in them. The images don't need a description or any other meta, so being able to mange them in a directory for each gallery seems much easier than trying to manage hundreds of images on a page.

I am therefore interested in this approach and have managed to get http://www.responsivefilemanager.com/ working by creating a "galleries" directory at the root level of the site, putting the responsive file manager code there in one directory, and then letting it manage other directories for the galleries. Securing the file manager seems problematic though. It doesn't seem possibly to fully integrate this into the PW User/Login though. I've followed the Bootstrap instructions http://processwire.com/api/include/ and can tie into PW, but $user isn't populated (always "guest"). I can retrieve a user with $wire->users->get, but then isLoggedin() seems to always return true.

I imagine this needs to be done in a Module to have more integration with PW and may look into doing that. I wanted to check first though to see if someone else has done this, or if it doesn't sound like a good idea at all, or other suggestions? Thanks!

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 matjazp
      Module: Auto Smush PDF
      https://github.com/matjazpotocnik/AutoSmushPDF 
      Compress PDF files automatically on upload,  manually by clicking the link for each file and in bulk mode for all PDF files.
      In Automatic mode PDF files that are uploaded are automatically compressed.
      In Manual mode "Compress" link will be present. This allows manual compression of the individual PDF file.
      In Bulk mode all PDF files can be compressed in one click. Will process PDF files sitewide, use with caution! 
      Using https://labstack.com/, free (at the moment) online web service that provides compressing of PDF files. There is no limit in file size and no limit on number of uploaded PDF's. No privacy policy available. 
       
      EDIT April 30 2017: This module is not working anymore as Labstack removed support for pdf compression.
    • By abdus
      After this tutorial you'll have learned how to:
      Build a Process module Make an AJAX request to backend Serve JSON as response Let's say you want to display the latest orders in a dashboard that you can access from admin panel. And you want it to refresh its content with a button click. Most straightforward and proper way (that I know of) is to create a Process module, as they're built for this purpose.
      First, create a directory under /site/modules/, call it ProcessDashboard, and create a file named ProcessDashboard.module under that directory. Following is about the least amount of code you need to create a Process module.
      <?php namespace ProcessWire; class ProcessDashboard extends Process implements Module { public static function getModuleInfo() { return [ 'title' => 'Orders Dashboard', 'summary' => 'Shows latest orders', 'version' => '0.0.1', 'author' => 'abdus', 'autoload' => true, // to automatically create process page 'page' => [ 'name' => 'order-dashboard', 'title' => 'Orders', 'template' => 'admin' ] ]; } public function install() { parent::install(); // to create process page } public function uninstall() { parent::uninstall(); // to the remove process page when uninstalling } public function ___execute() { return 'hello'; } } Once you refresh module cache from Modules > Refresh, you'll see your module. Install it.

      It will create an admin page under admin (/processwire/) and will show up as a new item in top menu, and when you click on it, it will show the markup we've built in execute() function.

       
      All right, now let's make it do something useful. Let's add create a data list to display latest orders. We'll change execute() function to render a data table.
      public function ___execute() { /* @var $table MarkupAdminDataTable */ $table = $this->modules->MarkupAdminDataTable; $table->setID($this->className . 'Table'); // "#ProcessDashboardTable" $table->headerRow([ 'Product', 'Date', 'Total' ]); // fill the table foreach ($this->getLatest(10) as $order) { $table->row([ $order['title'], $order['date'], $order['total'] ]); } // to refresh items $refreshButton = $this->modules->InputfieldSubmit; $refreshButton->name = 'refresh'; $refreshButton->id = $this->className . 'Refresh'; // "#ProcessDashboardRefresh" $refreshButton->value = 'Refresh'; // label of the button return $table->render() . $refreshButton->render(); } where getLatest() function finds and returns the latest orders (with only title, date and total fields)
      protected function getLatest($limit = 5, $start = 0) { // find last $limit orders, starting from $start $orders = $this->pages->find("template=order, sort=-created, limit=$limit, start=$start"); // Only return what's necessary return $orders->explode(function ($order) { return [ 'title' => $order->title, 'date' => date('Y-m-d h:i:s', $order->created), 'total' => $order->total ]; }); } When you refresh the page, you should see a table like this

      Now we'll make that Refresh button work. When the button is clicked, it will make an AJAX request to ./latest endpoint, which will return a JSON of latest orders. We need some JS to make AJAX request and render new values. Create a JS file ./assets/dashboard.js inside the module directory.
      window.addEventListener('DOMContentLoaded', function () { let refresh = document.querySelector('#ProcessDashboardRefresh'); let table = document.querySelector('#ProcessDashboardTable'); refresh.addEventListener('click', function (e) { // https://developer.mozilla.org/en/docs/Web/API/Event/preventDefault e.preventDefault(); // Send a GET request to ./latest // http://api.jquery.com/jquery.getjson/ $.getJSON('./latest', { limit: 10 }, function (data) { // check if data is how we want it // if (data.length) {} etc // it's good to go, update the table updateTable(data); }); }); function renderRow(row) { return `<tr> <td>${row.title}</td> <td>${row.date}</td> <td>${row.total}</td> </tr>`; } function updateTable(rows) { table.tBodies[0].innerHTML = rows.map(renderRow).join(''); } }); And we'll add this to list of JS that runs on backend inside init() function
      public function init() { $scriptUrl = $this->urls->$this . 'assets/dashboard.js'; $this->config->scripts->add($scriptUrl); } Requests to ./latest will be handled by ___executeLatest() function inside the module, just creating the function is enough, PW will do the routing. Here you should notice how we're getting query parameters that are sent with the request.
      // handles ./latest endpoint public function ___executeLatest() { // get limit from request, if not provided, default to 10 $limit = $this->sanitizer->int($this->input->get->limit) ?? 10; return json_encode($this->getRandom($limit)); } Here getRandom() returns random orders to make it look like there's new orders coming in. 
      protected function getRandom($limit = 5) { $orders = $this->pages->find("template=order, sort=random, limit=$limit"); return $orders->explode(function ($order) { return [ 'title' => $order->title, 'date' => date('Y-m-d h:i:s', $order->created), 'total' => $order->total ]; }); } And we're done. When refresh button is clicked, the table is refreshed with new data.
      Here it is in action: 
      2017-04-29_19-01-40.mp4 (227KB MP4, 0m4sec)
      Here's the source code:
      https://gist.github.com/abdusco/2bb649cd2fc181734a132b0e660f64a2
    • By justb3a
      Little admin helper module: Using this module you can view all template cache settings at once. E.g. cache status, cache time (configurable). Furthermore it adds the functionality to clear the entire template cache or just the template cache for a given template. Note that this may cause a temporary delay for one or more requests while pages are re-cached.

      GitHub: https://github.com/justb3a/processwire-templatecacheoverview
    • By blad
       
      Hi guys!
      I'm creating a module to manage, edit, publish ... pages. It is very similar to ProcessBatcher.
       
       
      Changelog:
      In progress 
      Features:



      Select pages with your mouse like a desktop enviroment. If you press "edit" the selected pages will appear in a lightbox.


      Drag pages to do actions.
      Any feedback is welcome
       
       
    • By abdus
      I dont know how they work internally, whether they depend on each other, but I'd love to be able to test and buy RepeaterMatrix or Multiplier or Table (or any other) module individually. Whole pack of ProFields modules seems awesome to have, however, being able to buy one for ~$30 --instead of all for $130-- sounds much more affordable and this way I could buy the whole pack part by part in several months and wouldn't think twice. But $130 at once, I can't really justify it (and still havent been able to) just as easily with low (to none) disposable student income.  Or instead, having sales one - twice a year would be great as well.
      One advantage of this change would be allowing more people to buy -> support the development & community -> give feedback -> improve these products. This could also potentially pose a disadvantage where requests from people would increase the headache and time required to respond to all these requests, but this community is more than able to handle that.
      I'm sure there's a reason to why these modules are sold together, and I'd love to hear your side as well, @ryan, (and all other maintainers).
      Regards,
      Abdus.