pleini Posted July 12, 2014 Share Posted July 12, 2014 Hi there, how can I bind a name to a certain template? E.g. if a new page is generated using the template "review", the page name (for the url) must be "review", the title as well "Review". How can I reach this (I guess with hooks) and where should I add it? Thank you for you help Link to comment Share on other sites More sharing options...
3fingers Posted July 12, 2014 Share Posted July 12, 2014 You don't need hooks in this particular case, take a look at this discussion. You'll find how to create pages via api. Link to comment Share on other sites More sharing options...
diogo Posted July 12, 2014 Share Posted July 12, 2014 @3fingers, I don't think that's whats being asked. @pleini, you can define rules for naming the children of a page in the family tab template of this parent page. To be able to do that you just have to define a single allowed template for the children http://processwire.com/api/modules/process-template/ Link to comment Share on other sites More sharing options...
3fingers Posted July 13, 2014 Share Posted July 13, 2014 @diogo, Well, if he needs to bind the name and title with the template's name couldn't be done like this? <?php $p = new Page(); // create new page object $p->template = 'review'; // set template $p->parent = wire('pages')->get('/whatever/'); // set the parent $p->name = $template->name; // grab the name of the template and set page name with it $p->title = $template->name; // same as above but with page title $p->save(); Should work as expected I think... Link to comment Share on other sites More sharing options...
diogo Posted July 13, 2014 Share Posted July 13, 2014 Yes, if the pages are created with the API, but I interpreted that the pages would be created via the admin. I can be wrong, of course. Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 Well I'm not sure if understand the purpose. I mean you could create those pages manually because you can only create those pages with page-name=template-name only once (for any parent) anyway. So could you may explain a little bit more of the context? Maybe there's a more elegant way to solve this. Link to comment Share on other sites More sharing options...
pleini Posted July 14, 2014 Author Share Posted July 14, 2014 Thank you for your help! I want to use the new PageTable module adding new pages with the backend. Using several templates, I cannot use the given template naming since it's designed just for one template. Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 What I would do: Give them all the same template and add a "switch" into the template file. Like if your template is called "page" put something like the following stuff into "page.php": <?php switch($page->name) { case 'apage': include 'page-apage.php'; break; case 'anotherpage': include 'page-anotherpage.php'; break; case 'maybeagallery': include 'gallery.php'; break; } Link to comment Share on other sites More sharing options...
pleini Posted July 14, 2014 Author Share Posted July 14, 2014 But for this solution I can still use and create pages which should not exist. So each template should have exactly one name (max. 1 page / page level due to unique page names) Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 So you want to have like 20 templates and 20 pages? Why don't you just do it manually then? Link to comment Share on other sites More sharing options...
pleini Posted July 14, 2014 Author Share Posted July 14, 2014 @Nico, yes, but they should be maintained via the backend. @3fingers, @diogo you got a further idea? Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 I think I still don't understand it - what do you have to maintain if you don't have to create new pages... you can edit the created pages anyway... Link to comment Share on other sites More sharing options...
pleini Posted July 14, 2014 Author Share Posted July 14, 2014 Sorry for my bad explanations. I create a new parent page (template movie, name star-wars, url /star-wars) There are a couple of subtemplates now but each one should appear max 1 time: /star-wars/review (Template movie_review) /star-wars/comments (Template movie_comments) /star-wars/actors (Template movie_actors) ... I repeat it with a new movie: /lord-of-the-rings/review (Template movie_review) /lord-of-the-rings/comments (Template movie_comments) /lord-of-the-rings/actors (Template movie_actors) Inside the template movie I can create using the new module pagetables new pages with those subtemplates. I have to make sure, that each move there is - one review - one or no comments - one or no actors page. How can I achieve it? Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 I think I understand it now. I would go with a custom module hooking into ProcessPageAdd::execute and check if this template already exists. If this is the case throw an error. Or alternatively check if the template is already set and if hide it in the drop down select. Link to comment Share on other sites More sharing options...
Nico Knoll Posted July 14, 2014 Share Posted July 14, 2014 (edited) Edit: Not sure if it works with PageTable but it works with the traditional way. Should work: <?php class SingleUseTemplate extends WireData implements Module { static public function getModuleInfo() { return array( 'title' => 'Single use template.', 'summary' => __('Single use template.'), 'version' => '100', 'author' => 'Nico Knoll', 'singular' => true, 'autoload' => 'template=admin' ); } public function init() { $this->addHookBefore('ProcessPageAdd::execute', $this, 'validateTemplate'); } public function ___validateTemplate(HookEvent $event) { if($this->input->post->submit_save) { $chosenTemplate = $this->config->input->post->template; $parent = $this->pages->get($this->input->post->parent_id); // enter the template for the "parent" page. Like in your example "movie" if($parent->template->name != 'movie') return false; // check if a sibling (same depth level) already uses this template foreach($parent->children as $child) { if((string)$child->template->id == $chosenTemplate) { throw new WireException('Template already used. Chose another one.'); } } } } } SingleUseTemplate.module Edited July 14, 2014 by Nico Knoll 1 Link to comment Share on other sites More sharing options...
LostKobrakai Posted July 14, 2014 Share Posted July 14, 2014 Another way to do this would be to pack all the infos in one template and use url-segments. Could be sorted in four tabs (main / review / comments / actor) with a checkbox to enable comments and/or actors. The code would be quite similar to nico's switch example. So you don't need to check, that there aren't duplicates, because it's all one page in the backend. <?php switch($input->urlSegment(1)) { case 'review': include 'page-apage.php'; break; case 'comments': if($page->comments_enabled) include 'page-anotherpage.php'; break; case 'actors': if($page->actors_enabled) include 'gallery.php'; break; } 2 Link to comment Share on other sites More sharing options...
diogo Posted July 15, 2014 Share Posted July 15, 2014 Yet another way would be to use url segments and page fields instead of having the page as children of each film. Just like tags and categories. https://processwire.com/talk/topic/3579-tutorial-approaches-to-categorising-site-content/ Link to comment Share on other sites More sharing options...
mr-fan Posted July 15, 2014 Share Posted July 15, 2014 I'm neebie here but like diogo said - is this possible with the setting.... 1.page movies with subpages for main moviepage starwars indiana jones 2. page reviews (can only create reviews) starwars indiana jones 3. page actors starwars indiana jones For fielddependencies this would be no problem choose the movie from a pageselection and bind the review to it - but: - is there a chance to get the url to be /moviename/review with this separation of content with parentpages and subpages? (may combine this contentsetup with LostKobrakai's code with URL segments but manage content with different parents as cathegories??) - you have to make adminpages for problems regarding missing content (show me all movies without a review....and so on) - may combine this with nicos module to setup no double create a actors page for the movie starwars... For 2-4 Contentblocks the Tabsolution with url segments from LostKobrakai would be the best....but in the first posts there was mentioned that it could be much more So you want to have like 20 templates and 20 pages? Why don't you just do it manually then? it would have limitations - for growing content, too! regards mr-fan interesting usecase here...many questions.. 1 Link to comment Share on other sites More sharing options...
pleini Posted July 15, 2014 Author Share Posted July 15, 2014 @Nico thank you for your code example!It looks like using hooks is the best solution for processwire. @LostKobrakai, @diogo, @mr-fan It depends on how many fields you have and in my opinion it makes more sense to have a review template for the review page so you pack things together. If you review not just movies (e.g. books) it even makes more sense. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now