<?php preg_replace( '/[^a-z][A-Z]/', '', $stringOfText )
CakePHP3 and Gulp file
Step 1. – Install Cakephp3 using
composer create-project --prefer-dist cakephp/app my_app_name
Step 2. – I’ve already installed npm on my machine…
Step 3. In cake’s folder src/Template/Pages/home.ctp we’ll add inside <head></head> tags this line:
<?php= $this->element('assets'); ?>
Step 3. Let’s create the assets.ctp file though…
In src/Template/Element/dev create assets.ctp file with this content
<?php
echo $this->Html->css('{{css}}');
echo $this->Html->script('{{main}}');
echo $this->fetch('css');
echo $this->fetch('script');
echo $this->fetch('meta');
echo $this->Html->meta('favicon.ico', '/favicon.ico', array('type' => 'icon'));
?>
This file is going to be used as a template when creating the src/Template/Element/assets.ctp – but this file will be created on the fly by gulp.
Step 4. In the ./ of our project create the gulpfile.js with this content:
var gulp = require('gulp'),
uglify = require('gulp-uglify'),
jshint = require('gulp-jshint'),
jshintStylish = require('jshint-stylish'),
concat = require('gulp-concat'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css'),
replace = require('gulp-replace'),
sourcemaps = require('gulp-sourcemaps'),
del = require('del'),
rename = require('gulp-rename'),
gutil = require('gulp-util'),
browserSync = require('browser-sync'),
typescript = require('gulp-typescript');
//Random number we'll use to append to JS and CSS files
var myLess = [
'webroot/css/main.less',
'webroot/css/variables.less',
'webroot/css/base.css'
];
var vendorScripts = [
];
var myScripts = [
"webroot/js/test.js",
"webroot/js/services.js",
"webroot/js/controllers/search.js",
"webroot/js/filters.js",
"webroot/js/directives.js",
"webroot/js/chartjs-directive.js",
"webroot/js/controllers/**/*.js",
];
var allScripts = vendorScripts.concat(myScripts);
var randNumber = Math.floor((Math.random() * 1000000) + 1);
//Minify JS files
gulp.task('scripts', function() {
return gulp.src(allScripts)
.pipe(uglify())
.pipe(concat('main-' + randNumber + '.min.js'))
.pipe(gulp.dest('webroot/js'));
});
gulp.task('legacyScripts', function() {
return gulp.src([
//"webroot/js/legacy/expenses.js",
])
.pipe(uglify({mangle: false}))
.pipe(concat('main.min.js'))
.pipe(gulp.dest('webroot/js/legacy'));
});
//Linting
gulp.task('scriptlint', function () {
return gulp.src(myScripts)
.pipe(jshint({
//camelcase: true,
forin: true,
freeze: true,
funcscope: true,
newcap: true,
nonbsp: true,
latedef: true,
unused: true,
maxcomplexity: 14
}))
.pipe(jshint.reporter(jshintStylish));
});
//Convert LESS to CSS and minify
gulp.task('less', function() {
return gulp.src('webroot/css/main.less')
.pipe(less())
.pipe(rename(function(path){
path.extname = '-' + randNumber + '.css';
}))
.pipe(minifyCSS())
.pipe(gulp.dest('webroot/css'))
// .pipe('bower_components/angular-chart.js/dist/angular-chart.css')
.pipe(browserSync.reload({stream:true}));
});
gulp.task('legacyLess', function() {
return gulp.src('webroot/js/legacy/legacy.less')
.pipe(less())
.pipe(minifyCSS())
.pipe(gulp.dest('webroot/css'))
.pipe(browserSync.reload({stream:true}));
});
gulp.task('bs-reload', function () {
browserSync.reload();
});
//Update base.ctp with random file name
gulp.task('filecache', function() {
return gulp.src(['src/Template/Element/dev/assets.ctp'])
.pipe(replace(/{{main}}/g, 'main-' + randNumber + '.min'))
.pipe(replace(/{{css}}/g, 'main-' + randNumber))
.pipe(gulp.dest('src/Template/Element/'));
});
gulp.task('browser-sync', function () {
browserSync({
proxy: 'internal.dev:8000',
});
});
gulp.task('startup', function() {
del(['webroot/js/main*']);
del(['webroot/css/main-*']);
gulp.watch(allScripts, ['scripts', 'scriptlint', 'filecache', 'bs-reload']);
gulp.watch(myLess, ['less', 'filecache']);
gulp.watch(['src/Template/**/*.ctp', '!src/Template/Element/dev/assets.ctp', '!Template/Element/assets.ctp'], ['bs-reload']);
});
gulp.task('default', ['startup', 'filecache', 'scripts', 'less', 'legacyScripts', 'legacyLess', 'browser-sync']);
Step 5. The file above assumes you have
- webroot/js/test.js – is just for testing that it’s working..
- webroot/css/main.less – content bellow:
@path: "";
@import "@{path}base.css";
@import "@{path}cake.css";
Now execute ‘gulp’ on CLI
Good React Tutorial
Angular JS bind data to page with CakePhp
<?php $response = array(); $response[] = array( 'policy_id' => $policy['Policy']['id'],
'letter_send_date' => $this->JobsLetter->getLetterSendDate($policy['AccountItem']['relation_id'])
);
$this->set([
'response' => $response,
'_serialize' => ['response']
]);
?>
<js>
(function (angular) {
"use strict";
angular.module('coreApp')
.directive('peterCoxRenewals', function () {
return {
restrict: 'E',
templateUrl: '/partials/petercox-renewals.html',
};
})
.filter (
'policyLetterAmount',
function() {
return function (p) {
return p.amount_inc_tax;
}
}
)
.controller(
'PeterCoxIndexCtrl',
['$scope', '$http', 'pagination',
function ($scope, $http, pagination) {
}
]
)
.controller(
'PeterCoxRenewalsCtrl',
['$scope', '$http', 'pagination', '$window',
function ($scope, $http, pagination) {
pagination.init($scope, '/peterCox/getRenewals.json');
$scope.limits = ['100', '500', '1000', '1300'];
$scope.processSelected = function() {
$scope.processSaving = true;
$http.post('/peterCox/processRenewals.json', {id: $scope.getSelectedIds()})
.then(function (amounts) {
angular.forEach($scope.items, function (item) {
if (item.selected) {
item.already_processed = true;
}
angular.forEach(amounts.data.new_amounts_inc_tax, function(k) {
if (k.policy_id == item.id) {
item.amount_inc_tax = k.amount_inc_tax;
item.letter_send_date = k.letter_send_date;
}
});
});
$scope.processSaving = false;
//window.location.reload();
return true;
}, function () {
return false;
}
);
}
}
]
)
;
}(angular));
And in HTML we have
<tr ng-repeat="p in items" ng-if="!paginatorLoading">
<td ng-if="!hideProcess"><input type="checkbox" ng-change="select(p)" ng-model="p.selected" ng-if="itemSelectable(p)"></td>
<td><a ng-href="/policy/get/{{p.id}}/{{p.scheme_prefix}}{{p.policy_id | lpad:6}}.pdf" target="_blank">{{::p.alpha_id}}</a></td>
<td>{{::p.next_renewal_date}}</td>
<td><a href="/core#/jobs/{{::p.job_id}}">{{::p.job_id}}</a></td>
<!--
<td>{{::p.amount_inc_tax | coreCurrency:'£'}}</td>
-->
<td ng-bind-html="p | policyLetterAmount"></td>
<!--
<td>{{::p.letter_send_date}}</td>
-->
<td ng-bind-html="p | policyLetterSendDate"></td>
<td>{{::p.address}}</td>
<td ng-bind-html="p | policyLetterStatus"></td>
</tr>
Install Cakephp 3 on docker
1. create a folder ‘cakephp’
2. create this docker-compose.yml file:
version: ‘2’
services:
webapp:
image: reinblau/lamp:latest
ports:
– “80:80”
depends_on:
– postgres
– memcached
volumes:
– ~/development/docker/cakephp:/var/www/html
env_file: env_vars/webapp_env_vars.env
memcached:
image: memcached:latest
postgres:
image: postgres:9.3
3. run $ docker-compose up –build -d
[iMac daniel.oraca cakephp]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c83b622a28c1 reinblau/lamp:latest “apache2-foreground” 10 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp cakephp_webapp_1
7195d09fbd10 postgres:9.3 “/docker-entrypoint.s” 11 minutes ago Up 10 minutes 5432/tcp cakephp_postgres_1
db475665040f memcached:latest “docker-entrypoint.sh” 11 minutes ago Up 10 minutes 11211/tcp cakephp_memcached_1
4. exec the shell of lamp container:
$ docker exec -it c83b622a28c1 /bin/bash
5. Navigate to /var/www/html
6. Install composer (https://getcomposer.org/download/)
$ php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);”
$ php -r “if (hash_file(‘SHA384’, ‘composer-setup.php’) === ‘e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae’) { echo ‘Installer verified’; } else { echo ‘Installer corrupt’; unlink(‘composer-setup.php’); } echo PHP_EOL;”
$ php composer-setup.php
$ php -r “unlink(‘composer-setup.php’);”
7. $ mv composer.phar /usr/local/bin/composer
8. composer self-update && composer create-project –prefer-dist cakephp/app my_app_name
9. install vim:
$ apt-get update
$ apt-get install vim
10. vim /etc/apache2/sites-enabled/000-default.conf
11. Change DocumentRoot /var/www/html/{{my_app_name}}
12. $ service apache2 reload
env_vars/webapp_env_vars.env file contains this:
DB_HOST=postgres
DB_PORT=5432
DB_USER=some_cool_dev
DB_PASSWORD=OMG_PLS_K33P_4_S3CRET
MEMCACHED_HOST=memcached
MEMCACHED_PORT=11211
SOME_VARIABLE_MY_WEBAPP_READS=a_value_i_use_to_configure_it