kongondo

Module: RuntimeMarkup Fieldtype & Inputfield

Recommended Posts

i have one type of button that submits via ajax so does all of the processing without opening a new window; some of my more primitive versions just open a new window to run the action...

  • Like 1

Share this post


Link to post
Share on other sites

yeah, i also went with ajax for now. but it's strange that it worked before... and it seems more complicated now than necessary and with pw that's usually the feeling when something is wrong :) 

Share this post


Link to post
Share on other sites
1 hour ago, bernhard said:

so what changed since your example here? and how could i detect clicks on buttons?

 

Nothing has changed. It works just fine. If you use $input->post in your 'my-file.php', it will work as expected. If used directly in 'Copy Paste' code, it won't.

 

1 hour ago, bernhard said:

and how could i detect clicks on buttons?

For buttons, that would have to be JS from what I see. E.g., dump this after if($copy) {} in my example in the quoted post:

echo '<pre>';
print_r($input->post);
echo '</pre>';
exit;

You will see all the POST values (but no 'submit_save' there; I guess the post is submitted in some other way) including the 'Create Copy' button, body fields, etc. So, to detect submit button, you could do the following in your 'my-file.php':

if($input->post->title) {
// blah blah
}

 

Share this post


Link to post
Share on other sites

Hi Kongondo

Thanks for this great module! I use it on several templates and in the frontend everything works fine. I use it mainly to concatenate text… Now i have a firstname and lastname field on the user that i combine into a single runtimemarkup field "fullname" – it displays correctly in the frontend but the backend profile page does not display the computed value: return $page->firstname." ".$page->lastname;

Any ideas on why that could happen?

Share this post


Link to post
Share on other sites

@noelboss - have you tried using TracyDebugger yet? You could get that going and then troubleshoot the contents of the $page in the profile editor; you may also be able to see warnings and errors when using Tracy. Using it is pretty much required if you are doing any serious dev work in the backend.

  • Like 3

Share this post


Link to post
Share on other sites
7 hours ago, noelboss said:

Hi Kongondo

Thanks for this great module! I use it on several templates and in the frontend everything works fine. I use it mainly to concatenate text… Now i have a firstname and lastname field on the user that i combine into a single runtimemarkup field "fullname" – it displays correctly in the frontend but the backend profile page does not display the computed value: return $page->firstname." ".$page->lastname;

Any ideas on why that could happen?

Welcome to the forums. Glad you find the module useful.

Regarding your question, it's hard to tell without seeing some code. Are you using the field directly in the ProcessWire user template or you have some other pseudo page for users?

Share this post


Link to post
Share on other sites
On 06/09/2017 at 4:57 AM, kongondo said:

Are you using the field directly in the ProcessWire user template or you have some other pseudo page for users?

I'm guessing he is talking about the profile edit interface (ProcessProfile). There are a couple of places where the module assumes/requires ProcessPageEdit.

Share this post


Link to post
Share on other sites

Hi all. 

I am intending to ONLY support ProcessWire 3.x starting from the next version of this module. Please have a read here and let me know what you think. Thanks.

Share this post


Link to post
Share on other sites

Is it possible to use field collapsed status with this - since the module itself doesn't have a value that can trigger 'populated' status (?)... I'm using a lot of these on a page , but need keep them all open...

Share this post


Link to post
Share on other sites
On 01/12/2017 at 3:35 PM, Macrura said:

but need keep them all open...

Aren't they all staying open?

 

On 01/12/2017 at 3:35 PM, Macrura said:

Is it possible to use field collapsed status

Will investigate. 

Share this post


Link to post
Share on other sites

oops, mis-typed, i meant keep closed when blank; they do stay open if set to open.

I guess maybe i need to make sure my code returns empty for this to work; will check again.

Share this post


Link to post
Share on other sites

Can't believe I discovered this awesome module only recently... I mean, it's over 2 years old now already :o

Here's another use-case: 

 

  • Like 3

Share this post


Link to post
Share on other sites

I'm getting a strange glitch with this.  I'm on PW 3.0.9.  If I put my code directly into the field it works fine, but if I try to use an external file using return ProcessWire\wireRenderFile('runtime.php');  the page is always returned as page id 10, not the the page I'm on.   

Not tragic as I can put the code directly in the field but would be better to have it external if possible.

Thanks!

Heather

Share this post


Link to post
Share on other sites

Hi @hezmann

33 minutes ago, hezmann said:

I'm getting a strange glitch with this.  I'm on PW 3.0.9.  If I put my code directly into the field it works fine, but if I try to use an external file using return ProcessWire\wireRenderFile('runtime.php');  the page is always returned as page id 10, not the the page I'm on.   

That's because the code (in the field) is locally scoped so that $page refers to the page you are editing. However, if using wireRenderFile(), you need to get the page being edited yourself. When editing a page, the page (named) edit is what ProcessWire assigns to $page. The page edit has the id 10. So, what you need is code like below to get the page being edited:

$currentPage = '';
$process = wire('process'); 
if($process && $process->className() == 'ProcessPageEdit') $currentPage = $process->getPage();
if(!$currentPage) return;
// if you get here $currentPage is the page being edited

More in this post. Sorry, this should be in the docs. I will update the docs at some point (when I get the time).

Hope this helps.

Edited by kongondo
  • Like 1

Share this post


Link to post
Share on other sites

Is it possible to use this field on a custom user template ? 

I'm trying but if I just put "return $page->id" in the field I have an error  "Undefined variable: page" ...
If I try with a external file, I have $page but It's the "users" parent page and not the user I'm editing 

:( 

Share this post


Link to post
Share on other sites
8 hours ago, Sonia Margollé said:

Is it possible to use this field on a custom user template ? 

I haven't tried, sorry. I'll check when I get a bit of time. I've never used the custom user template feature so will have to do a bit of reading first. Have you tried with wire('page')? This post might also be handy (i.e. establishing process context)

 

Share this post


Link to post
Share on other sites

Hey @kongondo - would you consider adding this to the module please?

$f = $this->modules->isInstalled('InputfieldAceExtended') ? $this->modules->get('InputfieldAceExtended') : $this->modules->get('InputfieldTextarea');

in the ___getConfigInputfields method?

Thanks!

Share this post


Link to post
Share on other sites

It would also be good to have:

$f->rows = 20;

or even make it configurable.

One other thing - because InputfieldAceExtended is not in inline mode, you need <?php to force code highlighting, but your module doesn't allow this. Would you mind stripping out any <?php that is added so that this works? This should do it:

$str = eval(str_replace('<?php', '', $this->runtimeFields));
$str = eval(str_replace('<?php', '', $field->runtimeFields));

One each for FieldtypeRuntimMarkup and InputfieldRuntimeMarkup.

Thanks!

Share this post


Link to post
Share on other sites

;)

But still I think using your IDE is the best option for larger code snippets... No need for ACE then. I'm still unsing my render replacement hook

 

Share this post


Link to post
Share on other sites
2 minutes ago, bernhard said:

But still I think using your IDE is the best option for larger code snippets... No need for ACE then

I still think it's nice to have even for short snippets, but maybe that's just me? If nothing else it lets you actually use the tab key to indent which you can't do in a normal textarea.

Share this post


Link to post
Share on other sites

Sure it's nice :) I think this was lost in translation :) I meant if you are using the IDE you don't need ACE, but of course it's nice to have it in the backend. The Tracy Console is a perfect example. I'm using ACE myself in several projects

  • Like 1

Share this post


Link to post
Share on other sites

Sorry @kongondo - me again :)

I am noticing that the renderMarkup() method is called many times on the currently edited page and it's also called on page reference fields on the page being edited. This makes for a lot of calls to this method that don't seem necessary as far as I can tell. Do you think this can be improved?

As an example, I put: bd($page->id); at the top of that method and saw this:

image.thumb.png.37bb806099db03174abb5d1ffeea5e9a.png

I am currently editing page 1100, but there are a few page reference fields which are also showing up in that list.

Thanks for taking a look!

 

 

  • Like 2

Share this post


Link to post
Share on other sites

Thanks @adrian. I'll look at these when I upgrade the module to PW3.x-support only. I have no ETA though, I'm afraid.

  • Like 1

Share this post


Link to post
Share on other sites

Hey @kongondo - seems like it's all because of the ___wakeupValue and ___sleepValue methods. Is there any reason they can't just return true, rather than returning $this->renderMarkup($page, $field); ?

Thanks!

  • Like 1

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 Sebi
      I've created a small module which lets you define a timestamp after which a page should be accessible. In addition you can define a timestamp when the release should end and the page should not be accessable any more.
      Github: https://github.com/Sebiworld/PageAccessReleasetime
      Usage
      PageAccessReleasetime can be installed like every other module in ProcessWire. Check the following guide for detailed information: How-To Install or Uninstall Modules
      After that, you will find checkboxes for activating the releasetime-fields at the settings-tab of each page. You don't need to add the fields to your templates manually.
      Check e.g. the checkbox "Activate Releasetime from?" and fill in a date in the future. The page will not be accessable for your users until the given date is reached.
      If you have $config->pagefileSecure = true, the module will protect files of unreleased pages as well.
      How it works
      This module hooks into Page::viewable to prevent users to access unreleased pages:
      public function hookPageViewable($event) { $page = $event->object; $viewable = $event->return; if($viewable){ // If the page would be viewable, additionally check Releasetime and User-Permission $viewable = $this->canUserSee($page); } $event->return = $viewable; } To prevent access to the files of unreleased pages, we hook into Page::isPublic and ProcessPageView::sendFile.
      public function hookPageIsPublic($e) { $page = $e->object; if($e->return && $this->isReleaseTimeSet($page)) { $e->return = false; } } The site/assets/files/ directory of pages, which isPublic() returns false, will get a '-' as prefix. This indicates ProcessWire (with activated $config->pagefileSecure) to check the file's permissions via PHP before delivering it to the client.
      The check wether a not-public file should be accessable happens in ProcessPageView::sendFile. We throw an 404 Exception if the current user must not see the file.
      public function hookProcessPageViewSendFile($e) { $page = $e->arguments[0]; if(!$this->canUserSee($page)) { throw new Wire404Exception('File not found'); } } Additionally we hook into ProcessPageEdit::buildForm to add the PageAccessReleasetime fields to each page and move them to the settings tab.
      Limitations
      In the current version, releasetime-protected pages will appear in wire('pages')->find() queries. If you want to display a list of pages, where pages could be releasetime-protected, you should double-check with $page->viewable() wether the page can be accessed. $page->viewable() returns false, if the page is not released yet.
      If you have an idea how unreleased pages can be filtered out of ProcessWire selector queries, feel free to write an issue, comment or make a pull request!
    • By David Karich
      Thanks to the great Pro module "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 this module on a different page (e.g. in the same design), you have to rebuild each item manually every time.
      With this proof of concept I have created a module which adds the feature to copy a repeater item to the clipboard so that you can paste this item to another page with the same repeater field. The module has been developed very rudimentarily so far. It is currently not possible to copy nested items. There is also no check of Min/Max. You can also only copy items that have the same field on different pages. And surely you can solve all this more elegantly with AJAX. But personally I lack the deeper understanding of the repeaters. Also missing on the Javascript side are event triggers for the repeaters, which would make it easier. Like e.g. RepeaterItemInitReady or similar.
      it would be great if @ryan would implement this functionality in the core of RepeaterMatrix. I think he has better ways to implement this. Or what do you think, Ryan?
      Everybody is welcome to work on this module and improve it, if it should not be integrated into the matrix core. Therefore I put it for testing and as download on GitHub: https://github.com/FlipZoomMedia/InputfieldRepeaterMatrixDublicate
      You can best see the functionality in the screencast: 
       
    • By anderson
      Hi,
      Please take a look at this:
      https://templatemag.com/demo/Good/
      The upper nav bar, including dropdowns like "pages" and "portfolios", what do you call this whole thing? At first I guess it's called "dropdown nav bar", but seems not.
      AND of course, what's the simplest way/module to achieve this in PW?
      Thanks in advance.
    • By Sebi2020
      Hey, I'm new and I created a simple module for tagging pages because I didn't found a module for it (sadly this is not a core feature). This module is licensed under the GPL3 and cames with absolutly no warranty at all. You should test the module before using it in production environments. Currently it's an alpha release. if you like the module or have ideas for improvements feel free to post a comment. Currently this fieldtype is only compatible with the Inputfield I've created to because I haven't found  an Inputfield yet, that returns arrays from a single html input.
      Greetings Sebi2020
      FieldtypeTags.zip.asc
      InputfieldTagify.zip
      InputfieldTagify.zip.asc
      FieldtypeTags.zip
    • By psy
      Background
      I'm creating a module to integrate https://pushalert.co/ into ProcessWire. You actually don't even need a module. You could just use the "Other Websites" javascript provided by PushAlert for basic functionality, ie send a broadcast notification to all subscribers. This is essentially what all the other integrations, including WordPress, do. The WP integration installs a widget with a form enabling the admin to enter details such as title, message, etc from a blog post. It does not:
      collect any statistics within the CMS about the notification enable audience fine tuning to eg a particular subscriber or subscriber segment within WP. The admin needs to use the PA dashboard for that functionality PushAlert has a javascript and REST API. It's intended that this module will use both. https://pushalert.co/documentation 
      What my module does so far:
      associate a subscription with a user. FE user clicks a button on the website front end to subscribe and/or agrees to the browser popup to accept notifications from this site send broadcast push alerts from a page within admin It doesn't have a 'widget' but easy enough to create a fieldsetpage with the relevant fields and add that fs page to any appropriate templates, then with a hook, send the notification. Need to be careful that once published/sent, the notification is not automatically re-sent on subsequent page edits.
      Looking for help/collaboration on how best:
      to send a notification, eg from a blog post, then track the statistics. Dilemma is that the push notification must come from the admin page. Responses go to the sending page which, as it's an admin page, is restricted and will not accept the https response. This is where the other CMS integrations stop. The only json response from PushAlert is the status, eg 'success', and the notification id. There is no opportunity at this point to capture the sending page id. handle, 'once sent on page publish', do not automatically resend on future page edits Am thinking along the lines that FS Page will have a @kongondo runtime markup field https://modules.processwire.com/modules/fieldtype-runtime-markup/ to pull the stats from PushAlert. Every time an admin visits the page, the stats will update.
      Once an admin checks the 'Send notification on page publish' checkbox, a hook creates new front end page that records the 'sender page', sends the notification request to PA, which then uses that newly created frontend page, as the response endpoint. Another rook re-associates the front end page with the admin page (eg blog post), to update the stats.
      Potential use cases:
      Notify individual and/or users with a particular role of an event, eg "New work opportunity" for job seekers; new blog post published; entries now open, etc...
      Looking for help/ideas/collaboration on this module. Please let me know if you're interested and as I do, believe this would be a great addition to ProcessWire