Unlike books and newspapers, old websites can be updated in design so that content looks up to date again without it being!
Contact Bernhard Webstudio to get a new look for your content!
Unlike books and newspapers, old websites can be updated in design so that content looks up to date again without it being!
Contact Bernhard Webstudio to get a new look for your content!
Have an awesome library you want to integrate in your Symfony application? Share your code between different Symfony instances? Share your code with other people? Create your bundle standalone and distribute it via Composer! Here is a short overview on how to do it.
To get started, you want to have a Composer & a git instance (if you follow the general practice to publish your bundle on a git-based central repository, such as GitHub or GitLab) running. All a Symfony third-party bundle has to be is a composer package. Everything else is bonus. To make your project a composer package, you add the `composer.json` file if you did not already. In it, you specify the name, properties and dependencies of your bundle. Comparsion with other bundles helps to get an impression of what to put in there.
Basically, it could look like mine for my PlaceholderBundle:
{
"name" : "bernhard-webstudio/placeholder-bundle",
"type" : "symfony-bundle",
"description" : "Symfony bundle to generate placeholders for images",
"keywords" : ["Symfony", "Placeholder"],
"homepage" : "https://github.com/BernhardWebstudio/PlaceholderBundle",
"license" : "MIT",
"authors" :
[
{
"name" : "Tim Bernhard",
"email" : "tim@bernhard-webstudio.ch",
"homepage" : "http://genieblog.ch",
"role" : "Developer"
}
],
After adding the boni, you will want to publish your bundle so other people can benefit from your bundle. There are various tutorials for this already so I will not write on.
To give the Symfony character to your package, you will want to integrate e.g. dependency injection, expose a class as a service or use the general Symfony configuration for your services. This can easily be achieved by adding the relevant Symfony components as dependencies via composer, e.g. use command composer require symfony/dependency-injection
. Afterwards, you can use them the same way you are using them in your Symfony application. Pay attention not to limit the dependency versions too much, otherwise you may prevent a user from upgrading Symfony.
There are may boni you can add to your repository, if it is published on e.g. GitHub: to give users and contributors a chance to better understand the state of your repository, integrate some of the apps and add badges to your README file.
Finally, let’s talk testing: as your package should not ship with a Kernel oder similar, you have nothing to simply run. There are workarounds: either you let your bundle live in a complete application, e.g. as a submodule, and test the application as a whole. Or you use unit-testing. If your choice falls on the latter, I can recommend using ConfigTest if your bundle uses the configuration component. Also, at one point, you may have to have an AppKernel to test the execution of a command or the availability of a route. Depending on the actual need, you can either mock the Kernel or create a TestKernel. For latter are many examples online in other bundles, e.g. in mine.
I created my first open-source Symfony bundle: PlaceholderBundle. It is an abstraction of Primitive and/or SQIP for use in a PHP respectively Symfony application. This way, you can automatically generate nice & adaptive placeholders for images in the format you like, all in your PHP application or your Twig template. Refer to the documentation on how to use the PlaceholderBundle. For now, the underlying nodejs packages still have to be installed separately, depending on which you want to use. The configuration allows to personalise the placeholders as much as the underlying applications allow it.
I will write a follow-up on how to begin with developing a third-pary bundle, as I think the resources for it are rather limited. A general tip is to checkout existing bundles on how to do it.
As SVGs should preferably not be base64 encoded when setting them on an
-tag src
-attribute, the suggested alternative is to URL-encode them. The standard PHP urlencode
function unfortunately is not suitable for this task, as the resulting value is not interpreted by any browser as a valid SVG image. Instead, the function rawurlencode
has to be used. Took me some time to realize. As soon as you get this, you can also take over some other optimizations; maybe get inspired by Taylor Hunts mini-svg-uri to decode some characters manually to improve the overall size. A final function could possibly look like this:
function svgUrlEncode($svgPath)
{
$data = \file_get_contents($svgPath);
$data = \preg_replace('/\v(?:[\v\h]+)/', ' ', $data);
$data = \str_replace('"', "'", $data);
$data = \rawurlencode($data);
// re-decode a few characters understood by browsers to improve compression
$data = \str_replace('%20', ' ', $data);
$data = \str_replace('%3D', '=', $data);
$data = \str_replace('%3A', ':', $data);
$data = \str_replace('%2F', '/', $data);
return $data;
}
When integrating Elasticsearch with Symfony, there can be a few troubles for newcomers.
The easiest way to achieve integration is by following the setup instructions of the FOSElasticaBundle, in case you have a running Elasticsearch instance already at least. Symfony 3.1 or higher is required for this bundle. When following the setup instructions, there are a few caveats, which differed from what I expected. In the following post, I try to sketch some of the problems respectively solutions.
When you finally have the configuration set up, you have to run ./bin/console-dev fos:elastica:populate
. This will show you errors in the configuration, if you have some, respectively sync your database with the elasticsearch instance.
The next step you will want to take is to use Elasticsearch to search, duh. This can get tricky at first if you are used to SQL search queries, especially as the relevant query classes are not yet as good documented as expected. The best way for me was to combine the knowledge of which classes exist with the elasticsearch documentation itself.
To translate from an SQL query to an Elastica-Query, keep the following in mind:
Elastica\Query\BoolQuery
Elastica\Query\Nested
Elastica\Query\Range
With this knowledge, a query such as (...) WHERE (post.title LIKE %$search% OR creator.firstName LIKE %$search% OR creator.lastName LIKE %$search%) AND post.start < $date
translates to (for example, in a custom search repository class, extends FOS\ElasticaBundle\Repository
) :
setQuery($search)->setFields('firstName', 'lastName');
$creatorQuery->setPath('creator')->setQuery($nameQuery);
$textQuery->addShould($creatorQuery);
$titleQuery = new Match('title', $search);
$textQuery->addShould($titleQuery);
$overallQuery->addMust($textQuery);
$dateQuery = new Range('start', array('lt' => $date->format(ELASTICA_DATE_FORMAT)));
$overallQuery->addMust($dateQuery);
/** ... **/
This query can be executed like it is on the finder/repository yielding results. But. It will not work with a Paginator and a default number of 10 results will be returned instead. To successfully get the PaginatorAdabter, the whole BoolQuery has to be wrapped in an Elastica\Query
Object.
This could be achieved e.g.:
$query = new Query();
// code from above
$query->setQuery($overallQuery);
And to get the Pagination working:
$elasticaFinder->createPaginatorAdapter($query);
To fix this error, all I had to do is install runit-systemd
. This error appeared after the upgrade from Debian wheezy over jezzie to stretch when trying to get the status respectively start or stop, or just do anything with the command sv
. The installation may happen e.g. with apt:
sudo apt-get install runit-systemd
There are a few proposed ways to hack a default value to form fields. The problen gets bigger when handling CollectionType
s, as the underlying objects don’t get constructed automatically. Workarounds are numerous, e.g. simply setting prototype_data
on the CollectionType
to an instantiated object. Unfortunately, for me, not one of these worked out when working with nested CollectionTypes.
The only way that worked out for me was adding a DataTransformer
which checks in the reverseTransform
function whether the object to transform is null
, and if, set it to a new instance instead. The default values are than set in the constructor of the underlying object or in the reverseTransform function too, depending on your (performance) needs.
I sure hope this gets improved one day, but for now, this workaround is very comprehensible so I would not think about submitting an issue or pull request or even ask why this is necessary. This way, I even have more control over the new objects.
Well, at least I would like this kind of controversy/conspiracy as it would lead to the opposite effect of what the vaccination-conspiracy is leading to today. Also, this theory would be a lot more supportable by evidence, numbers and logic than the dangerous conspiracy which is spread today.
I sincerly hope that one day, people can relax a bit more over their opinions, find a common midway, depending on the issue, and stop braging with unconventional, illogical and inconsequent ideas.
Spotlight on Mac works with Bing, like Cortana!
Well, not really, unfortunately. This funny trivia fact is not true anymore since 25.9.2017 .
Lange hat es gedauert, doch nun scheint dieser Punkt auch an Cortana zu gehen: Seit nicht allzu langer Zeit ist einerseits Cortana auf Windows 10 Geräten auch in der Schweiz standardmässig verfügbar, ohne dass man gross tricksen muss, und andererseits Siri verfügbar auf Desktop-Geräten und Laptops, die mit dem neusten MacOS ausgerüstet sind. Aber den wharen Punkt gibt es, da insbesondere Cortana bald auch auf iOs- und Adroid-Geräten verfügbar, was von Siri umgekehrt wohl nie behauptet werden kann.
The Apple Superdrive drive is easy to use on Windows. However, the appropriate driver must be installed for this.
Here’s how to do it: Download the Apple Boot Camp Support Software . The file is a zip file, a “zip-compressed folder”, as Windows calls it. Unpack the file and then open the unzipped folder. Go to subfolder / BootCamp / Drivers / Apple. There you will find a file called “AppleODDInstaller64.exe” (you may not see the extension “.exe”). Use this file to install the driver by double-clicking it and following the installation wizard. That’s it! The next time you attach the Apple SuperDrive drive, your Windows should be able to recognize and work with it.
Bringt – insbesondere da es gratis ist – neue Browser auf tausende Rechner. Ein grosses Hurra von jedem Web Developer. Und doch steckt Microsoft Edge noch in den Kinderschuhen.
I dynamically generate MediaQueries from Zurb Foundation breakpoints for a grid with the following Sass code:
$i: 2;
@each $s,
$breakpoint in $breakpoints {
@media (min-width: $breakpoint) {
div.grid {
.element {
width: calc(100%/#{$i});
}
}
}
$i: $i+1;
}
In my case, it generates the media queries for all breakpoints defined for the Zurb Foundation Framework in the Sass array $breakpoints
. For each breakpoint, it increases the number of elements displayed in a row of the grid by adjusting its width, starting with two elements for the smallest screen width. Of course, for the .element, the display
property must be set to inline-block
.
Welches ist der höchste Ort in Moskau? Der Keller von Lubjanka, von dort sieht man bis nach Sibirien…
Bei meinem Abenteuer in Moskau und Sankt Petersburg habe ich einiges gelernt. Vieles davon hatte ich eigentlich schon gewusst, doch nicht zu Herzen genommen. Dazu gehört:
Passend noch einige Fun Facts, die mich mehr oder weniger überrascht haben: