Jump to:

17452 Posts in 4473 Topics by 1971 members

Archive

SilverStripe Forums » Archive » Custom Controls - Totally lost

Our old forums are still available as a read-only archive.

Moderators: martimiz, Sean, biapar, Willr, Ingo, simon_w

Page: 1 2 3
Go to End
Author Topic: 6092 Views
  • Jona
    Avatar
    Community Member
    19 Posts

    Custom Controls - Totally lost Link to this post

    Hello community,

    I am a new user of SS and have found it very powerful. However, I can't seem to find straight answers by searching (which I have been doing here and on the Wiki for about 7 hours now). I have seen _some_ code around here that explains how to add a custom control, but when I tried it, it didn't work.

    Basically, I just want to be able to set $TemplateControlVariable to whatever value I want and use it across all Pages. Here's what I have.

    class Page_Controller extends ContentController {
       function init() {
          parent::init();
          
          Requirements::themedCSS("layout");
          Requirements::themedCSS("typography");
          Requirements::themedCSS("form");
       }

       function TemplateControlVariable() {
       return "test";
       }
    }

    Of course, I have a lot more in mind than something so simple, but getting this piece right is a major step. I'm familiar with PHP but not SS.

    Thanks in advance for any help you can provide.

  • ajshort
    Avatar
    Community Member
    244 Posts

    Re: Custom Controls - Totally lost Link to this post

    Hey Jona,

    you have the right idea - adding a method to a class will make it available in the $MethodName format whenever the class is rendered into a template (as classes, rather than a stack of variables are rendered using the SS template engine).

    However, your problem could be one of two things:

    1) You are adding the code to the wrong class. You have added your method into the Page_Controller class. This is fine when rendering the controller, but the method will not show up when you render a plain Page model (the Page class).

    This will be the case when using a DataObject::get('Page') or similar, as it returns the Page model object rather than first linking it to a controller. Maybe try adding your method to the model rather than the controller.

    2) Your template is not updating, SilverStripe parses a template into intermediate PHP code to allow for faster execution, then caches this. In order to force a cache rebuild, just append ?flush to the end of your URL.

    edit: formatting messed up

  • Sean
    Avatar
    Forum Moderator
    921 Posts

    Re: Custom Controls - Totally lost Link to this post

    I don't see anything wrong with that example - even if it's in Page_Controller the template for Page.ss should still be able to render that template variable...

    It's more a matter of standard to place more methods in the model over the controller, as opposed to actual requirement. There's also advantages like being able to call methods on the Page object, when using it in other classes.

  • Jona
    Avatar
    Community Member
    19 Posts

    Re: Custom Controls - Totally lost Link to this post

    Thank you for your responses.

    Ajshort, after reading your suggestion, I thought it may have something to do with inheritance or the file system (a file missing, uploaded to the wrong location, or overridden by another file). To ensure this isn't a simple placement error, let me explain the structure I have.

    I am viewing the HomePage, an extension of Page. In my themes/themename/ directory, I have code/HomePage.php, code/Page.php (where the code I posted can be found), templates/HomePage.ss, templates/Page.ss, templates/Layout/HomePage.ss, and /template/Layout/Page.ss. In essence, edits I make to the templates/Page.ss file are reflected both on the HomePage and all other pages, with the exception of the content ($Layout), which differs between the HomePage and all other pages. If this is confusing (or poorly written, as the case may be), I can perhaps upload a .zip file that more clearly explains where I'm coming from.

    Assuming that the structure above is correct, I have been putting the Page_Controller class's extension of ContentController in code/Page.php. Ajshort, you pointed out that this works when rendering the controller -- if I am looking at the HomePage, am I correct in my assumption that the controller is, in fact, being rendered? If not, could please explain how I would create a class extension of the model instead?

    Thankfully, this does not appear to be a caching issue. I would feel quite silly if it was! The Wiki poignantly noted that using a ?flush=1 query string would reset the cache. (I have found that shift+reload is necessary most of the time despite that, however.)

    Sean, your last comment hinted at something somewhat unrelated, but interesting. I was under the impression that it was more pragmatic (and conventional) to use private and protected variables to prevent the illegal reading or overwriting of variables among classes and/or subclasses. Am I misunderstanding you, or is this structure unique to SS?

  • Sean
    Avatar
    Forum Moderator
    921 Posts

    Re: Custom Controls - Totally lost Link to this post

    Jona, that is also possible. However, if you do want to share a method between classes then it gives you that possibility, as functions in php obviously default to public. You can still make them private or protected as you see fit, however.

  • Jona
    Avatar
    Community Member
    19 Posts

    Re: Custom Controls - Totally lost Link to this post

    Ah, I see. That makes sense.

    Do you have any recommendations concerning my other question or any idea as to why my current setup is not working as expected?

  • spenniec
    Avatar
    Community Member
    37 Posts

    Re: Custom Controls - Totally lost Link to this post

    Jona

    You wrote

    I am viewing the HomePage, an extension of Page. In my themes/themename/ directory, I have code/HomePage.php, code/Page.php (where the code I posted can be found)

    If your code is under your theme directory then I'm pretty sure SS isn't loading it. Have you tried it under under mysite/code...

  • Jona
    Avatar
    Community Member
    19 Posts

    Re: Custom Controls - Totally lost Link to this post

    I am using a custom theme. I am seeing the appearance of the theme just fine -- it works as intended (although it took some work to figure out how to get that to occur). I did not want to keep files in mysite/ or tutorials/, so naturally I moved them to themes/myThemeName. When I view the homepage and subsequent pages on my site on the user side, I am seeing my theme -- it is loading the CSS and HTML, and when I edit my theme files, the changes are reflected on what appears on the user side of the web site. I am confident that my theme is working correctly at this point. What I do not understand is why my methods are not being picked up by SS -- the reference to my method is removed from the HTML that is output by SS entirely. Instead of outputting the method result (in this case, the string "test"), it outputs an empty string (""). Presumably this has to do with PHP's default behavior regarding Boolean values -- apparently, SS is calling for a method that it cannot find, and when it cannot find it, it returns a Boolean false, which equates to an empty string in PHP.

    It would seem, under these circumstances, that there is something wrong with the code I have in Page.php. That, or possibly no inheritance is occurring on HomePage.php (which is an empty extension of Page.php), but I have no way to test this as the method is not working on HomePages or Pages. (In other words, the function should work on Pages even if it doesn't work on the HomePages, but I am not seeing it work in either case and cannot therefore conclude whether inheritance is working as expected.)

    6092 Views
Page: 1 2 3
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.