Jump to content

gebeer

Members
  • Posts

    1,394
  • Joined

  • Last visited

  • Days Won

    39

Posts posted by gebeer

  1. On 9/19/2022 at 10:09 PM, artfulrobot said:

    (I'm specifically looking for how to create a page with several pagetable field values programmatically).

    Behind the scenes entries in a PageTable field are just regular pages in a regular PageArray. Lets say you have a field "pagetable" and it is configured to use template "blog-post" for items.

    You can create a new page with new items in the pagetable field like this:

    // create page that holds pagetable items
    $p = new Page();
    $p->template = 'basic-page';
    $p->parent = '/foo/';
    $p->title = "Bar";
    $p->save();
    // get parent id for pagetable items from field config
    $parentID = $p->getField('pagetable')->parent_id;
    // create item page for field pagetable
    $item = new Page();
    $item->template = 'blog-post';
    $item->parent = $parentID;
    $item->title = "Item Foo";
    $item->save();
    // add item page to pagetable field
    $p->pagetable->add($item);
    $p->save('pagetable');

    Since the value of $p->pagetable is a PageArray, you can find and manipulate the pagetable items with methods from Pages, PageArray and WireArray.

    To remove a specific item:

    $item = $p->pagetable->get('title="Item Foo"');
    $p->of(false);
    $p->pagetable->remove($item);
    $p->save('pagetable');

     You can also use WireArray manipulation methods insertBefore(), insertAfter(), append(), prepend() to add items in a specific order.

    • Like 3
  2. 5 hours ago, gornycreative said:

    Perhaps referring to an undeclared index?

    Unfortunately not anymore since 8.0. The docs say

    Quote
    • A number of notices have been converted into warnings:

       

      • Attempting to read an undefined variable.
      • Attempting to read an undefined property.
      • Attempting to read an undefined array key.
      • Attempting to read a property of a non-object.
      • Attempting to access an array index of a non-array.
      • Attempting to convert an array to string.
      • Attempting to use a resource as an array key.
      • Attempting to use null, a boolean, or a float as a string offset.
      • Attempting to read an out-of-bounds string offset.
      • Attempting to assign an empty string to a string offset.

    But thanks for looking into it 🙂

     

  3. I think what you are looking for is an https://processwire.com/api/ref/inputfield-markup/ inside your Block Ordering Tab. You can use that to output the markup that is being supplied by your Hannacode. And you don't even need that Hannacode. Because your development template ordering lives on a single page that doesn't change in different contexts. So you can produce the markup for InputfieldMarkup from that page id.

    For InputfieldMarkup you can set the property markupFunktion to a closure that outputs your block order. Something like

    /** @var InputfieldMarkup $f */
    $f = $this->wire->modules->get('InputfieldMarkup');
    $f->set('label', 'Development Template Ordering Status');
    $f->set('markupFunction', function () {
        $markup = '';
        foreach(wire('pages')->get(yourid)->get('block_order_field') as $block) {
            $markup .= "{$block->title}<br>";
        }
        return $markup;
    });
    $inputfields->add($f);

     This will output something like

    438871294_2023-02-28-095512.png.f74889dc3f5e148617d182ccb6394db9.png

      

    • Like 2
  4. 3 minutes ago, alexm said:

    Sorry @gebeer I should have added, that yes when I add the addition of include=all it works just fine, but I don't understand why I would need to for this use case? Is it something to do with the fact that "hero_image_section" is a FieldsetPage and therefore it's another page it's getting the image from?

    Yeah, I guess that is why. My understanding is that every FieldsetPage field value is stored on page in the Admin pagetree behind the scenes. And by default those are not accessible for guest users.

  5. In your selector the Repater Matrix Type is missing. Your "items" repeater matrix field needs to have some named "types" setup in the field configuration screen. The textfield is inside that type.

    If repeater matrix field "items" with type "image_text" has a field "textfield", your selector would look like: content_sections.items.type=image_text

    To get all pages that have items of type image_text  you can use. 

    $pagesWithType = $pages->find("content_sections.items.type=image_text");

    To get all the texts you need to loop through those pages and get your textfield value

    foreach($pagesWithType as $p) {
        $term = $p->get('textfield');
    }

    Or you can get an array of all terms like this

    $terms = $pagesWithType->explode('textfield');

    Seehttps://processwire.com/api/ref/wire-array/explode/

    EDIT: removed initial selector added code with loop etc

    • Like 1
  6. Time to revive this 8 year old thread 🙂

    I'm using vscodium as editor and recently for code formatting I moved from the excellent https://intelephense.com/ extension to an extension that uses https://github.com/PHP-CS-Fixer/PHP-CS-Fixer which is based on https://github.com/squizlabs/PHP_CodeSniffer. This allows custom style definitions (rulesets) https://github.com/squizlabs/PHP_CodeSniffer/wiki/Advanced-Usage#using-a-default-configuration-file

    PW coding style guide says:

    Quote

    The ProcessWire coding style guide is based on PSR-1 and PSR-2 (with many sections copied directly from them), but with several important differences and additions.

    Has anybody ever gone through the trouble of creating a custom PW ruleset.xml? Just asking before I start spending my time on that. Other CMSs/Frameworks do have their ruleset files. See
    https://github.com/WordPress/WordPress-Coding-Standards 
    https://www.drupal.org/docs/contributed-modules/code-review-module/installing-coder-sniffer 
    https://github.com/fossbarrow/laravel-phpcs 

    Would be great if we had one for ProcessWire, too. Maybe @ryan  already uses one and can share it? If not, we could start a community effort to produce such ruleset. It would help tremendously for PRs to the PW core or for module development.

    • Like 3
  7. On 6/9/2022 at 4:50 AM, louisstephens said:

    I have been using tabnine and it has been great. They seem very similar, but I will check out copilot for sure.

    Just installed Tabnine and went on coding as usual on PW projects. It seems that it is not aware of all the PW specific classes, methods, API variables etc. Or do you experience differently? Maybe it takes some time until it picks up PW specific stuff. It surely was not trained on PW core code because the PW licensing model is not permissive by Tabnine's definition since it uses MPL 2.0 alongside MIT and others. Maybe GHs Copilot has an advantage there?

  8. I've been working further on the module concept and found a (mostly reliable) way to react on all error types in PW. Just wanted to share my findings before a release.

    Looking through PW core, I found that nowhere PW registers custom error or exception handlers. So I decided to use set_error_handler() for warnings/notices and set_exception_handler() for exceptions. To also cover fatal errors, I hook into WireShutdown::fatalError instead of registering my own shutdown function. Gladly Ryan provides that hook 🙂

    So the basis for my operations looks like this in the module's init():

            $this->originalErrorHandler = set_error_handler(array($this, 'errorHandler'), E_NOTICE|E_USER_NOTICE|E_WARNING|E_USER_WARNING);
            $this->originalExceptionHandler = set_exception_handler(array($this, 'exceptionHandler'));
            $this->wire->addHookAfter('WireShutdown::fatalError', $this, 'fatalHandler');

    Note, how I save the original error and exception handlers, so I can set them back once I've finished my operations so that my module doesn't interfere with other modules that use their own handlers (like TracyDebugger).

    For now I'm only doing the send email based on error type part. The https://rollbar.com/ part will most likely go into a separate module.

    I still need to test some on a production site until there will be an alpha/beta release.

    Related question: does anybody know how to deliberately cause an E_NOTICE error, other than using trigger_error('My error', E_USER_NOTICE) in PHP > 8?
    I couldn't find or think of a real world example. Before PHP 8 we could use "echo $undeclaredVariable". But since 8 those notices are converted to warnings.

    • Like 2
  9. @kongondo Where are messages from MM actions like uploads etc are supposed to appear in the GUI? I mean messages that are generated during executeAjax(). I can see them as JSON response in the dev tools for requests to e.g. /processwire/media-manager/ajax/ like

    {
    	"files": [
    		{
    			"name": "csm_us_ziehmvisionrfdhybridedition-usa-forweb_1080x1080px_7c9dea3ab6.jpg",
    			"size": 34682
    		}
    	],
    	"count_total": 1,
    	"count_success": 1,
    	"count_fail": 0,
    	"message": "error",
    	"notice": "Media Manager: No valid media found to add to Media Library. If replacing media, check that they are not locked.",
    	"nothingAddedYet": "Nothing added yet.",
    	"action": "upload",
    	"currentPageID": 0,
    	"mediaManagerFieldID": 0,
    	"insertAndClose": 0,
    	"galleryID": "",
    	"notice2": "Media Manager: Some media were not added because names already in use (csm_us_ziehmvisionrfdhybridedition-usa-forweb_1080x1080px_7c9dea3ab6.jpg)."
    }

    But there is no message output in the GUI after upload.

    153486760_2023-02-23-131656.thumb.png.df5b2de8200e78fba07399bfef5bf1b0.png

    In this case a duplicate image was ignored for upload. Are these JSON responses supposed to be shown as messages in the GUI? If not, it would be awesome if they could be shown to the user.

    • Like 1
  10. On 2/15/2023 at 4:55 PM, gebeer said:

    Hi, bringing this up again because I found the reason. On install of MM, the children under Admin->MediaManager got named "media-manager--image", --audio etc. No idea how this happended, though. Guess I will rename them manually. Since on upload the parent is defined by those page names, no parent is defined and all media gets saved under Media Manage:Audio.
    A check in MediaManagerActions.php around  L1575  for $parent instancof NullPage or the like would be great to at least issue a warning.
    Consequently the checks for duplicates on upload did not work. This is how I discovered the root cause.    

    Just to recap in case anyone else experienced this: After MM install I ended up with pages with wrong names (media-manager--audio, --document, --image, --video) under Admin->Media Manager. As a consequence all created media pages got saved under parent Admin->Media Manager->Media Manager:Audio. This also had an impact on duplicate media pages. They could not be detected. So no matter what the settings for duplicate media, all media got uploaded even if it was duplicates.

    I used this code to rename pages under Admin->Media Manager to have correct names like (media-manager-audio, -document, -image, -video) and move all media pages to live under their correct parent pages:

    		// FIX wrong Media Manager page names under Admin -> Media Manager and sort media pages under correct parent
    		$types = ['audio', 'document', 'image', 'video'];
    		// fix page names from "media-manager--$type" to "media-manager-$type"
    		foreach($types as $type) {
    			$pID = $this->wire->pages->getId("parent.name=media-manager, name=media-manager--{$type}");
    			if($pID) {
    				$this->wire->pages->get($pID)->setAndSave('name', "media-manager-{$type}");
    			}
    		}
    		// move media pages from wrong parent media-manager-audio to correct parent "media-manager-$type"
    		foreach($types as $type) {
    			// get all media pages under media-manager-audio parent
    			$ids = $this->wire->pages->findIDs("parent.name=media-manager-audio, media_manager_{$type}!=");
    			// put them under correct parent
    			if(count($ids)) {
    				$parentID = $this->wire->pages->getID("parent.name=media-manager, name=media-manager-{$type}");
    				if($parentID) {
    					foreach($ids as $id) {
    						$p = $this->wire->pages->get($id);
    						$p->setAndSave('parent', $parentID);
    					}
    				}
    			}
    		}

     

    • Like 1
  11. Hi @bernhardjust installed a brandnew PW with https://github.com/processwire/site-regular/blob/main/README.md site profile on a local ddev with PHP 8.1. First thing I wanted to install was RockMigrations. After going to Modules->Site->Add New and pasting in the class name and clicking on Get Module Info, I got an exception:

    DEBUG MODE BACKTRACE ($config->debug == true):
    #0 /var/www/html/wire/core/Modules.php(688): ProcessWire\ProcessPageEditImageSelect->init()
    #1 /var/www/html/wire/core/Modules.php(1455): ProcessWire\Modules->initModule(Object(ProcessWire\ProcessPageEditImageSelect), Array)
    #2 /var/www/html/wire/core/Modules.php(1262): ProcessWire\Modules->getModule('ProcessPageEdit...')
    #3 /var/www/html/wire/core/Modules.php(1712): ProcessWire\Modules->get('ProcessPageEdit...')
    #4 /var/www/html/wire/core/WireArray.php(1789): ProcessWire\Modules->find('alsosetincompos...')
    #5 /var/www/html/wire/core/WireArray.php(583): ProcessWire\WireArray->findOne('alsosetincompos...')
    #6 /var/www/html/wire/core/Modules.php(1913): ProcessWire\WireArray->get('alsosetincompos...')
    #7 /var/www/html/wire/modules/Process/ProcessModule/ProcessModule.module(1166): ProcessWire\Modules->isInstalled('alsosetincompos...')
    #8 /var/www/html/wire/core/Wire.php(419): ProcessWire\ProcessModule->___buildDownloadConfirmForm(Array, false)
    #9 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___buildDownloa...', Array)
    #10 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessModule), 'buildDownloadCo...', Array)
    #11 /var/www/html/wire/modules/Process/ProcessModule/ProcessModule.module(1080): ProcessWire\Wire->__call('buildDownloadCo...', Array)
    #12 /var/www/html/wire/modules/Process/ProcessModule/ProcessModule.module(340): ProcessWire\ProcessModule->downloadConfirm('RockMigrations')
    #13 /var/www/html/wire/core/Wire.php(413): ProcessWire\ProcessModule->___execute()
    #14 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___execute', Array)
    #15 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessModule), 'execute', Array)
    #16 /var/www/html/wire/core/ProcessController.php(350): ProcessWire\Wire->__call('execute', Array)
    #17 /var/www/html/wire/core/Wire.php(413): ProcessWire\ProcessController->___execute()
    #18 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___execute', Array)
    #19 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessController), 'execute', Array)
    #20 /var/www/html/wire/core/admin.php(160): ProcessWire\Wire->__call('execute', Array)
    #21 /var/www/html/site/templates/admin.php(16): require('/var/www/html/w...')
    #22 /var/www/html/wire/core/TemplateFile.php(328): require('/var/www/html/s...')
    #23 /var/www/html/wire/core/Wire.php(413): ProcessWire\TemplateFile->___render()
    #24 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___render', Array)
    #25 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\TemplateFile), 'render', Array)
    #26 /var/www/html/wire/modules/PageRender.module(575): ProcessWire\Wire->__call('render', Array)
    #27 /var/www/html/wire/core/Wire.php(416): ProcessWire\PageRender->___renderPage(Object(ProcessWire\HookEvent))
    #28 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___renderPage', Array)
    #29 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\PageRender), 'renderPage', Array)
    #30 /var/www/html/wire/core/WireHooks.php(1060): ProcessWire\Wire->__call('renderPage', Array)
    #31 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\Page), 'render', Array)
    #32 /var/www/html/wire/modules/Process/ProcessPageView.module(184): ProcessWire\Wire->__call('render', Array)
    #33 /var/www/html/wire/modules/Process/ProcessPageView.module(114): ProcessWire\ProcessPageView->renderPage(Object(ProcessWire\Page), Object(ProcessWire\PagesRequest))
    #34 /var/www/html/wire/core/Wire.php(416): ProcessWire\ProcessPageView->___execute(true)
    #35 /var/www/html/wire/core/WireHooks.php(952): ProcessWire\Wire->_callMethod('___execute', Array)
    #36 /var/www/html/wire/core/Wire.php(484): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessPageView), 'execute', Array)
    #37 /var/www/html/index.php(55): ProcessWire\Wire->__call('execute', Array)
    #38 {main}

    Other module installs I tested (ProcessWireUpgrade, ProcessDatabaseBackups), went fine. Don't know if this is related to the site profile or your module. Just wanted to let you know.

  12. 10 hours ago, adrian said:

    That could be built into Tracy if you want it. Currently the email logging is just all error levels to all listed email addresses, but I am sure we could support different levels per email. Up to you of course but it just feels like a good fit to me.

    Don't think that many people will have a need for this. But would be nice for sure 🙂 Reason why I need a separate module is also that it should be independent of other modules (aka TD). I am using Tracy on every install. But not all devs do that and the agency I am freelancing for would like to have it as a standalone tool.

    • Like 1
  13. On 11/30/2022 at 6:56 PM, gebeer said:

    @kongondoIn my install (PW 3.0.200), Media Manager pages for images and documents get saved under Admin->Media Manager->Media Manager:Audio instead of Media Manager:Image and Media Manager:Document. They have the correct template media-manager-image and media-manager-document, but are under the wrong parent.

    What could be the reason?

    Hi, bringing this up again because I found the reason. On install of MM, the children under Admin->MediaManager got named "media-manager--image", --audio etc. No idea how this happended, though. Guess I will rename them manually. Since on upload the parent is defined by those page names, no parent is defined and all media gets saved under Media Manage:Audio.
    A check in MediaManagerActions.php around  L1575  for $parent instancof NullPage or the like would be great to at least issue a warning.
    Consequently the checks for duplicates on upload did not work. This is how I discovered the root cause.    

    • Like 1
  14. @adrian Thank you for all the info. That will help a lot.

    10 hours ago, adrian said:

    the Tracy core handles this via PHP's set_error_handler

    will look through your code where Tracy gets started up. That should give me good pointers. Rollbar also uses set_error_handler. Their docs say to init Rollbar at the entry point of the application. I'll find the right place to do this.

    10 hours ago, adrian said:

    Looking at what your trying to do here, can I suggest that you extend Tracy rather than creating a new module. Recently I added the ability for Tracy to log to Slack

    Great pointer. I need this as a standalone module because we want to have different targets to report to based on error levels.. But once I have that, we can add an option to Tracy as well.

    Thanks again for all those useful links.

     

    • Like 1
  15. Thanks again @flydev

    I am still investigating this. In wire/core/Wire.php there is a hookable method trackException. This seems to be a good place to hook into for errors/exceptions.

    But for Warnings I'm still not 100% sure how to them. To me it seems like WireLog is only taking care of 'error' and 'exception'. Notices has a NoticeWarning class. That looks promising but they seem to only get logged when in debug mode. I will experiment with those findings.

    FYI: The module I am planning to build will most likely include an option to send errors to https://rollbar.com/ using https://docs.rollbar.com/docs/basic-php-installation-setup. But also an option to just email them to configurable addresses.

     

    • Like 2
  16. Hi @adrian Tracy is acting on all Errors/Exceptions (and in strict mode also Warnings) while it is active. May I ask how your module achieves that?

    This question is related to 

    Basically I want to catch all Errors/Exceptions (+ Warnings, if possible) and act upon them. And I'm struggling in finding a clever way to do so.

    In your module I see a hook to 'ProcessWire::trackException'. Would this be a good place to start for Exceptions?

    But what about Warnings?

    For example, if I wanted to use an external service for error reporting like https://docs.rollbar.com/docs/basic-php-installation-setup, where would I intercept PW Errors to init my custom error handler? 

×
×
  • Create New...