Monday, April 9, 2012

Re: SEO/Meta Data Helper

If you're invoking the getData method i would use a behavior, but if it's goin to work by itself (without you calling a method) I would go with a component, like Mark said.

Cya,
--
Thiago Belem
Desenvolvedor
Rio de Janeiro - RJ - Brasil

thiagobelem.net
contato@thiagobelem.net

Skype / gTalk » thiago.belem.web
LinkedIn » br.linkedin.com/in/thiagobelem/pt
Assando Sites
, curso de CakePHP » assando-sites.com.br


On Mon, Apr 9, 2012 at 22:47, euromark <dereuromark@googlemail.com> wrote:
I was more thinking about a more "automatically" working component then
Which - if enabled - fetches the appropriate meta information for this action and passes it on.
this component can also add the helper automatically and the helper would do the rest on its own.
otherwise you are not using the full potential of it.

and using a behavioral approach as Thiago suggested would probably also work.
But I' probably go for the component.


Am Dienstag, 10. April 2012 03:36:48 UTC+2 schrieb Thiago Belem:

Why don't you put this getMeta method inside your model or create a behavior?

 

Thiago Belem

Enviado do meu Android (e sujeito a erros do corretor automático)

Em 09/04/2012 22:24, "creat1v1ty" <justin.r.rankin@gmail.com> escreveu:
Thanks again euromark - I've taken your advice and tips and created a SEO Component, which I feel is the best solution. It keeps my MVC conventions in tact and hopefully is a more efficient way of doing what I need to do.

Here is what I have now:

SeoComponent.php
=================================
public function getTags($page) {
    App::import('Model', 'Meta');
    $Model = ClassRegistry::init('Meta');
    $seo_data = $Model->find('first', array('conditions' => array('Meta.page' => $page)));
    $seo_tags['title'] = $seo_data['Meta']['title'];
    $seo_tags['description'] = $seo_data['Meta']['description'];
    $seo_tags['keywords'] = $seo_data['Meta']['keywords'];
    return $seo_tags;
}

PagesController.php
=================================
public function home($page) {
    $this->set('page', $page);
    $this->set('seo_tags', $this->Seo->getTags($page));
}

default.ctp
=================================
<?php echo $seo_tags['title']; ?>
<?php echo $seo_tags['description']; ?>
<?php echo $seo_tags['keywords']; ?>


Please feel free to comment and/or make suggestions on any ways I might be able to further refine/improve. Thanks again for all your help!



On Monday, April 9, 2012 7:33:19 PM UTC-5, euromark wrote:
I am not saying you can never break MVC or cake conventions. I do so myself occasionally. But it should have sane reasoning then.
In your case it could be also solved using a component which does what you are doing in the view - fetching the data from the model.
It could then pass it down to the view level where you only have to display it.
That would be in MVC (fetching model data in the view layer is considered breaking it).

But your solution simplifies the task. So as long as it doesn't break other (real) things it is not completely wrong to intentionally go down this road.



Am Dienstag, 10. April 2012 00:07:24 UTC+2 schrieb creat1v1ty:
Thanks very much for the insights, euromark. Here is some additional info based on your questions:

Not sure if breaking MVC is really the best way to go here - breaking MVC is not something I am doing intentionally. To be completely honest, I don't know how doing what I'm doing breaks MVC...perhaps you can help me understand that. My goal is to keep my code as clean and semantic as possible.

Also not sure how you want to pass $page (is it the final url after routing or the prefix/plugin/controller/action/ string?) - for the pages of the site that are managed by the PagesController, I am relying on the default variable Cake uses ($page), which is set in routes.php.

ex:  Router::connect('/about', array('controller' => 'pages', 'action' => 'display', 'about'));

For pages not managed by the PagesController, I am setting the $page variable for each action in that controller.

ex:  $this->set('page', 'contact-index');

If you want people to contribute and discuss your code in detail, you should open a github rep for it - I appreciate the tip and will definitely keep this in mind going forward. With this request, however, the code I've written is pretty minimal - the extent of it is in my original post. I do understand, however, that seeing code in its context is much more efficient.

PS: it also sounds like something that could be made a "Seo" plugin to make it available for multiple apps. - I agree completely, and would love to pass something beneficial along to others to use as well. However, I don't really feel comfortable pitching something that isn't built correctly, or outside of MVC conventions. Also, I don't really have the experience with Cake to understand what's needed to build a plugin, and how I can take what I've done and turn it into one. That being said, I am definitely open to suggestions and help in doing it.

Thanks again, euromark.

On Monday, April 9, 2012 4:31:33 PM UTC-5, euromark wrote:
IF you really need to use a model in this context you should never use "new" but ClassRegistry:

$Model = ClassRegistry::init('Meta');

Not sure if breaking MVC is really the best way to go here. But if it works for you, nobody will force you to 
undo your obviously working code. Also not sure how you want to pass $page (is it the final url after routing or
the prefix/plugin/controller/action/ string? both solutions could work, might have different pros and cons.
Other than that it looks fine. I know there are some plugins which do it not that much different you do.

Without specific inside in your application there is only so much one can suggest.
Just take the "silence" regarding your thread as a "not beautiful, but not really problematic either".
Everything else is your thing. Not ours.
If you want people to contribute and discuss your code in detail, you should open a github rep for it.
So others can fork or submit issues. Reading through a lot of code without code highlighting is no fun.

PS: it also sounds like something that could be made a "Seo" plugin to make it available for multiple apps.
you never know when you will need it (or others for that matter). Just something to think about.
But then use: `$Model = ClassRegistry::init('Seo.Meta');` :)

good luck
mark


Am Montag, 9. April 2012 21:37:51 UTC+2 schrieb creat1v1ty:
anyone out there have any suggestions/recommendations for me?

Thanks in advance.

--
Our newest site for the community: CakePHP Video Tutorials http://tv.cakephp.org
Check out the new CakePHP Questions site http://ask.cakephp.org and help others with their CakePHP related questions.
 
 
To unsubscribe from this group, send email to
cake-php+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php

--
Our newest site for the community: CakePHP Video Tutorials http://tv.cakephp.org
Check out the new CakePHP Questions site http://ask.cakephp.org and help others with their CakePHP related questions.
 
 
To unsubscribe from this group, send email to
cake-php+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php

No comments: