Override Cakephp 3 core class - cakephp

I'd like to override a function that exists in the CakePHP 3 core (to be more specific Cake\Database\ValueBinder).
How can I achieve this? I tried copying the class to src/Database/ and changed the namespace from Cake to App. I use'd the class in AppController, but had no luck.
Thanks in advance
Adrian

ndm helped me a lot with this (see comments to my question), but since he didn't post an answer I am doing this now.
It's possible to use an own ValueBinder by setting it on my query: $this->Table->find()->valueBinder(myOwnValueBinder).
To make that the default ValueBinder in my own code (sufficient in most cases) one can use e.g. an AppTable as known from CakePHP 2 that extends to Table and make all other *Table classes extend AppTable. Now one only needs to create the following method:
public function query() {
return parent::query()->valueBinder(myOwnValueBinder);
}
In case it's needed that all code uses teh custom ValueBinder, an extended datasource Connection class has to be created (and used). In this class Connection::newQuery() has to be overriden.

Related

Database table prefixes

I don't know if I skipped something in the doc but I don't see the 'tableprefix' statement anymore in the database configuration nor in Models and when I search for tableprefix, I only see it in 2.x documentation.
Is it still possible to use tableprefix and how?
Regards
It's not possible, as per 3.0. And 3.1 doesn't seem to me that is working on that. So, in the meantime, I think the simplest solution is doing the following:
class Post extends AppModel {
public $useTable = 'wp_posts';
}

Replacement for AppModel in Cakephp3

I would like to implement an autoslug-function for two models in CakePHP3 and use the beforeSave-callback for that which works fine. However the slug structure is a bit different than in Inflector::slug, so I wrote a small function for the different structure which finally leads to my question
In Cake2 I would have placed this helper function in AppModel which is not existing anymore. What's the best way to do that now? A behaviour (which seems a bit biggish for 2 lines of code) or class AppTable extends Table or ..?
Make it a behavior and use it where needed instead of putting it in a super model class. If you put that into a plugin and repository you can simply add your plugin as package via composer for every app that needs this plugin.

CakePHP custom function (but not global)

I have a module that handles translations.
It is not bound to any database, the file is purely and simply something like this:
$arr["key1"]="text";
...
I need to make Ajax calls in order to edit that file. That file will be imported each time a page is accessed in order to deliver any text content that I need (it may not be the best thing of the world but it does the job, and it's supposed to be really fast since there's no "XML parsing" kind of thing, it is simply stored in a standard .php file).
To handle these ajax calls that will have actions like Add/Edit operations, I have made a TranslationController that is Model-less:
class TranslationsController extends AppController {
public $uses = array(); // Model-less
public $components = array('RequestHandler');
public $helpers = array('Session');
protected $translationFilePath;
public function setItem() {
}
public function backupFile() {
}
}
My problem is simple: where do I put custom functions that are used to open/write/find in files?
For example I have a function that extracts a key from the line that is being read.
I've seen some posts where we are advised to place the data inside the model but in my case I have no model AND it's these functions are not linked to the data. So it shouldn't be in the model, right? I do not want it to be global.
Thank you for your help.
Why are you not using the built in translation stuff that comes with CakePHP and is based on the more or less standard gettext tools?
What you're doing is just re-inventing the wheel and probably coming up with a non tested customized translation implementation that is obviously lacking feature that CakePHP alreay offers you. For example how do you handle plurals?
CakePHP offers you __(), __d(), __n(), __dn() for translations and the translation files are stored in APP/Locale/ as plain text files and are edited with poedit.
See http://www.gnu.org/software/gettext/ and http://book.cakephp.org/2.0/en/core-libraries/internationalization-and-localization.html
Sounds like a use case for a custom datasource: http://book.cakephp.org/2.0/en/models/datasources.html.
Personally, I would just create a normal PHP class in the app/Lib folder of your application.

How do I code a MVC3 Helper

I’ve just build my first Helper in MVC, it’s very basic and just displays a string where ever I use it. So it’s a .cshtml file in my App_Code folder, I think that is how it's supposed to be set up, with the following code in it,
#helper DisplaySelect() {
#:This text is coming from an helper class.
}
Now I am a wiz with helpers how do I make it do things. E.g.. say I want it to query the database and display something, I would normally do that work in my controller. How do I do that with helpers, do I create a helper controller and then treat the helper like a partial view???
Any help would be greatly appreciated.
Cheers,
Mike.
Thanks guys,
I’ve asked that question before Shark “Why would you use a helper and not a partial view” the answer I got there was a partial view is more for just displaying common HTML where as a Helper can have a bunch of code in it and do all kinds of great processing stuff. Now it seems that’s not true and they are pretty much the same thing, in some respect, except in Link664’s case!
I like what you’re saying Link664 that makes sense as it cleans up the code nicely.
What I was going to do was try and populate a drop down list in a helper and then use it in multiple places, but from my research today that’s not what helpers are for.
Cheers,
Mike.
I'm a bit confused by what you want to do and why you want to do it but I'll give it a go. As you mentioned, you would normally do that work in your controller. It is very poor design to make database calls from a partial view/html helper created client-side.
The #helper syntax is to be used only for simplifying view code, not for implementing code that should be in the controllers or models in the view. See this article for a better idea of when you should be using them.
As for your example, I recommend you pass the data that you want from your controller and create an extension method on HtmlHelper to render it in your view. For example if you wanted to display a list of the most recent 10 posts on your view:
public static HtmlString RecentPostsDisplay(this HtmlHelper html, string name,
List<Post> values, object htmlAttributes)
{
var tag = new TagBuilder("ul");
...
//build list content by looping through values and adding to TagBuilder
...
return new HtmlString(tag.ToString(TagRenderMode.SelfClosing));
}
and in your controller
public ActionResult Blah()
{
ViewBag.posts = _db.GetMostRecentPosts();
return View();
}
Then in your view you can put
#Html.RecentPostsDisplay(ViewBag.RecentPosts)
Hopefully that is what you are looking for, if not update your question so it's not so ambiguous and I'll try again!

cakePHP: Overload Sanitize

In the recent cakePHP 1.3.4 version I discovered that Sanitize::html returns double encoded html entities - because of the newly added fourth parameter of htmlentities 'double_encode'.
Here is a corresponding ticket on cakePHP: http://cakephp.lighthouseapp.com/projects/42648/tickets/1152-sanitizehtml-needs-double_encode-parameter-in-htmlentities
Since I need to use cakePHP 1.3.4 on PHP 5.2.14 I need to change the double_encode parameter. Is there a way to overload the Sanitize::html method in cake so I don't have to fiddle with the core?
You can subclass it in the /app/libs directory:
App::import('Sanitize');
class MySanitize extends Sanitize {
public static function html(...) {
...
}
}
You'll have to switch to use MySanitize instead of Sanitize, but that shouldn't be a big problem. A text find/replace can take care of it if you're using it a lot already.

Resources