Pull to refresh

CakePHP. Behaviors — измена!

Lumber room
Как обычно я не ищу лёгких путей, и как обычно сталкиваюсь с задачами не рассмотренными в book.cakephp.org ;-)

Всегда, самой хлопотной частью проекта для меня являлся paginate и всё что с ним связано (выборки, сортировки).

И вот сейчас, я в очередной раз наступил на грабли, причём ответа на мой вопрос — нет.

Итак, в чём состояла задача:

Model A — hasMany Model B
Model B — belongsTo Model A

Model B — actAs ('Image')

Image — чудесный behavior Евгения Томенко, который служит для связки записи в модели с сохранённой картинкой.

В случае запроса Model B ->… любой формы — behavior срабатывал как часы, и я получал нужные мне данные, в данном случае — картинки.

Однако, когда стала задача построить запрос вида

Model B -> Model -> A ( с условиями, где выборка идёт по полям Model A)

оказалось — что поиск и педжинация работают отлично, однако в результатах связанной Model B — нет и следа работы behavior… Я просто получал поля модели, без нужных мне «искривлений».

Никакие танцы-пляски с Contain, порядком запроса и т.д. — ни к чему не привели. Ответа так же нет и в гуглегруппе.

А сегодня я нашёл ещё одни грабли, но уже с behavior Translate. Если воспользоваться инструкцией, и сделать как там советуется — всё работает отлично, кроме мой любимой педжинации…

А именно — сортировать по полям, расположенным в i18n таблице — нельзя. Не получится. Только по тем полям, которые присутствуют в явном виде. Вот так.

Я, конечно, не хочу сказать, что сортировка построенная через i18n таблицу будет работать быстро, или в принципе будет работать вменяемым образом. Может и не будет. Но в таком случае, если необходимо как-то сортировать результаты кроме id,created — то никаких шансов использовать этот behavior у вас нет. Он не сработает. :(

И если первые грабли можно обойти вторым запросом (сначала получив список id Model B, а потом затребовать непосредственно из Model B все записи (тут-то behavior сработает). То во вторых граблях, единственный способ сортировать — обходиться без коробочного behavior.

2All: Если кто-то решил данные вопросы — поделитесь решением в комментариях. Речь идёт о CakePHP 1.2.3.8166
Total votes 3: ↑1 and ↓2 -1
Views 239
Comments 8

Поддержка Data:URL Internet Explorer'ом

Website development *
Многим известен данный способ отображения картинок, но особой популярностью он не пользуется, т.к. имеет проблемы с отображением в Internet Explorer (IE 6,7 — вообще не понимают, что им дают. А IE8 — принимает только картинки меньше 32кб).

Как же решить эту проблему?
Читать дальше →
Total votes 43: ↑37 and ↓6 +31
Views 7K
Comments 36

Сохрание связанных моделей в Yii

Yii *
Я не так давно написал компонент, в котором реализовал сохранение связанных записей (CActiveRecord) и хотел бы поделиться этим кодом.

Я заметил, что часто пишется повторяющийся код, когда, например, нужно сохранить даные о клиенте со всеми его контактами, то пишется что-то типа такого (по крайней мере, я так писал):
   if ($client->save()) {
         foreach ($contacts as $contact) {
               $contact->clientId = $client->primaryKey;
               $contact->save();
         }
   }

Разумеется, этот код сопровождается валидацией и обработкой ошибок, а так же может быть заключен в трансакцию. Чего бы мне хотелось — так это сделать универсальный код для сохранения по разному связанных между собой моделей.
Читать дальше →
Total votes 8: ↑6 and ↓2 +4
Views 11K
Comments 10

DOM-shim для всех браузеров включая IE < 8

JavaScript *
Доброе время суток уважаемые хабражители.

Многие javascript-программисты сталкивались с не поддерживанием некоторых функций DOM JS API в некоторых браузерах (не будем показывать пальцем). Наверняка, многие знакомы с замечательными библиотеками es5-shim и DOM-shim для решения проблем совместимости между разными браузерами, а DOM-shim к тому же, «подтягивает» браузер до уровня DOM4.

В данной же статье я расскажу, как сделать DOM-shim в IE6 и IE7, чтобы навсегда забыть о существовании этих браузеров.
Читать дальше →
Total votes 43: ↑41 and ↓2 +39
Views 12K
Comments 13

Создаем поведение (behavior) для Yii2

PHP *Yii *
Sandbox
Часто, а на самом деле практически всегда, при создании сайта необходимо, чтобы страницы сайта открывались не по id сущности в базе, а по текстовому идентификатору, назовем его slug.

post/view/1 => post/view/testovaya-novost


(из url'а стоило бы убрать и view, но урок не о том)

Самым примитивным путем можно создать в таблице post поле slug, в модели Post соответственно появляется новый атрибут, в представление (view) добавляем новый input, в который ручками вбиваем slug.


<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

/**
 * @var yii\web\View           $this
 * @var common\models\Post     $model
 * @var yii\widgets\ActiveForm $form
 */
?>

<div class="post-form">

	<?php $form = ActiveForm::begin(); ?>

	<?= $form->field( $model, 'name' )->textInput( [ 'maxlength' => 255 ] ) ?>
	<?= $form->field( $model, 'slug' )->textInput( [ 'maxlength' => 255 ] ) ?>
	<?= $form->field( $model, 'content' )->textarea( [ 'rows' => 6 ] ) ?>

	<div class="form-group">
		<?= Html::submitButton( $model->isNewRecord ? Yii::t( 'app', 'Create' ) : Yii::t( 'app', 'Update' ), [ 'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ] ) ?>
	</div>

	<?php ActiveForm::end(); ?>

</div>


Читать дальше →
Total votes 17: ↑12 and ↓5 +7
Views 78K
Comments 28

Yii связь многие ко многим

Yii *
Sandbox
many-to-many

Вступление


Привет, хабр! Многие, наверное, сталкивались с необходимостью реализовать функционал связи многие-ко-многим в Yii. Казалось бы, тут нет ничего сложного, и скорее всего разработчики фреймворка уже постарались за нас реализовать необходимый функционал связи, и нам остаётся только прописать необходимые связи в модели, и, пользуясь привычными методами, сохранить данные.
Читать дальше →
Total votes 11: ↑7 and ↓4 +3
Views 18K
Comments 13

Устраняем ошибки при получении от пользователя массива вместо строки

Yii *
Недавно я заметил, что на многих сайтах сделанных на Yii Framework есть одна и та же ошибка:
Если в каком нибудь поле ввода в атрибуте name добавить квадратные скобки и отправить форму, то можно получить сообщение об ошибке, типа:
htmlspecialchars() expects parameter 1 to be string, array given
Иногда даже можно увидеть исходный код PHP файлов, если разработчик забыл убрать константу YII_DEBUG.

Эта ошибка присутствует и на крупных проектах и даже на самом yiiframework.com/search/?q%5b%5d=
Читать дальше →
Total votes 38: ↑26 and ↓12 +14
Views 14K
Comments 5

WPF: использование Attached Property и Behavior

.NET *Development for Windows *
Sandbox
Пожалуй, любой разработчик WPF знает о механизме Attached Property, но многие даже не слышали о Behavior. Хотя эти механизмы и имеют схожие функциональные возможности, они, все же, имеют совершенно разную смысловую нагрузку, и очень важно правильно различать их и использовать.

Давайте вспомним, что из себя представляют эти механизмы:
Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Views 39K
Comments 2

Перехватываем всё с помощью CoordinatorLayout Behavior

Development for Android *
Sandbox
Предлагаю вашему вниманию перевод статьи Ian Lake Intercepting everything with CoordinatorLayout Behaviors.

Вы не продвинетесь далеко в изучении Android Design Support Library, не столкнувшись с CoordinatorLayout. Множество View из Design Library требуют CoordinatorLayout. Но почему? Сам по себе CoordinatorLayout делает не так уж и много, если использовать его с View, входящими в состав Android фреймворка, то он будет работать, как обычный FrameLayout. Так откуда берётся вся его магия? Вот где на сцену выходит CoordinatorLayout.Behavior. Подключив Behavior к дочерней View у CoordinatorLayout, вы сможете перехватывать касания, оконные вставки (window insets), изменения размеров и макета (measurement и layout), а также вложенную прокрутку. Design Library широко использует Behavior чтобы добавить силу большинству функционалу, которую вы видите.


Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Views 44K
Comments 0

Списки действий: простой, гибкий, расширяемый ИИ

Plarium corporate blog Development of mobile applications *Game development *C# *Game testing *
Translation
Большинство людей привыкли решать задачи знакомыми и понятными им способами. Мы предпочитаем не сходить с проторенной дорожки и не изобретать велосипед, даже если это сулит очевидную выгоду. Избавиться от такого образа мышления очень сложно, поэтому мы продолжаем использовать устаревшие технологии и решения, тем самым вызывая недоумение у наших более продвинутых ровесников. В этой и следующих статьях я хочу познакомить читателей с широким спектром решений, способных повысить качество разработки. Сегодня мы поговорим о списках действий.


Читать дальше →
Total votes 18: ↑16 and ↓2 +14
Views 20K
Comments 5

Behaviors — конечный автомат без головной боли

JavaScript *
Tutorial
Стандартный подход к описанию последовательности вводов пользователя и реакции на них (например при управлении персонажем в игре) — это конечный автомат (state machine). Он, однако, часто приводит к громоздким программам, понимание которых требует немалых усилий или даже зарисовок на бумаге. В этой статье я предлагаю небольшой сдвиг в описании, который позволяет экономить место на экране и мозговой ресурс.


image

Сдвиг в описании заключается в использовании техники сопрограмм. Для применения этой техники, необходимо представить, какое поведение мы ожидаем от компьютера в итоге. Поэтому я назвал небольшую библиотеку, которую создал под эту задачу — Behaviors.
Читать дальше →
Total votes 16: ↑11 and ↓5 +6
Views 4.3K
Comments 5

Использование let объявлений переменных и особенности образуемых связываний в замыканиях в JavaScript

JavaScript *Programming *Algorithms *ООP *
Sandbox
Написать данную заметку меня сподвигло прочтение статьи на Хабре «Var, let или const? Проблемы областей видимости переменных и ES6» и комментариев к ней, а также соответствующей части книги Закаса Н. «Understanding of ECMAScript 6». Исходя из прочитанного я вынес, что не всё так однозначно в оценке использования var или let. Авторы и комментаторы склоняются к тому, что при отсутствии необходимости поддержки старых версий браузеров имеет смысл полностью отказаться от использования var, а также использовать некоторые упрощенные конструкции, заместо старых, по умолчанию.

Про области видимости этих объявлений уже сказано достаточно, в том числе и в указанных выше материалах, поэтому я хотел бы заострить внимание только на некоторых неочевидных моментах.
Читать дальше →
Total votes 23: ↑22 and ↓1 +21
Views 10K
Comments 1

Defined or Undefined? Нюансы создания массивов в JavaScript

JavaScript *Programming *Algorithms *ООP *
image

Пару месяцев назад я наткнулся на интересный вопрос на stackoverflow, там, если вкратце, человек хотел создать пустую матрицу 5х5, и, используя один способ у него получилось, а используя другой — нет. В развернувшейся дискуссии на этот счёт были приведены интересные мысли.

Правда, задавший вопрос, так же как и те кто ему отвечал, не обратили внимания, на то, что фактически матрицу не получилось создать, а приведенный результат вычислений некорректен. Всё это меня заинтересовало, и, я решил копнуть чуть глубже, чтобы затем прийти к интересным умозаключениям, с которыми сейчас с вами и поделюсь.
Читать дальше →
Total votes 32: ↑31 and ↓1 +30
Views 12K
Comments 29

Xamarin.Forms — удобное использование иконочных шрифтов в приложении

Xamarin *
Sandbox

Постановка задачи


Для отображения иконок в приложении Xamarin.Forms можно использовать изображения в различных форматах, например png, svg или шрифты ttf. Чаще всего для добавления стандартных иконок удобен шрифт с иконками, например google material icons. Шрифт с иконками имеет размер около 200КБ и удобство использования здесь обычно важнее экономии на размере приложения. Иконки будут хорошо смотреться при любом разрешении экрана и будут чёрно-белыми.

Для использования иконок есть готовые nuget-пакеты. Я долгое время использовал iconize (nuget — www.nuget.org/packages/Xam.Plugin.Iconize; git — github.com/jsmarcus/Iconize). Он позволяет подключать более десяти шрифтов, добавляет новые контролы, такие как IconButton, IconImage, IconLabel и т.п. Но тут есть обычные аргументы против готовых библиотек: лишний функционал, лишний размер файлов, не полностью устраивает поведение, баги и т.п. Поэтому в определённый момент решил отказаться от готовой библиотеки и заменить ее на простейший велосипед из пары классов + шрифт.
Читать дальше →
Total votes 13: ↑11 and ↓2 +9
Views 3.4K
Comments 0

На SDK надейся и сам не плошай: Проблема вложенных скроллов в BottomSheetBehavior

Development for Android *

Наверное, каждый, любуясь красивыми и магически плавно съезжающими в разные стороны окошками, тулбарами и остальными вьюхами, задумывался как это работает, наверное, даже что-то читал про CoordianatorLayout, про различные Behaivor, которые позволяют создавать буквально волшебство на андроидовских вьюхах. Конечно, можно писать кастомные вьюхи, с нужным поведением, которое может быть ограничено только твоим воображением или твоими знаниями в Android разработке. Но помимо этого, есть ещё одно ограничение — время, не будешь же ты писать кастомную вьюху на хакатоне, в горящем по срокам проекте, а написанные заранее решения с кастомными вьюхами могут быть освоены не за самый короткий срок членами команды. Именно тогда приходит самое простое и самое логичное решение проблемы — не выпендриваться, использовать стандартные инструменты Android, там же смышлённые ребята сидят, всё будет в шоколаде (ну или в других сладостях андроида).


Но не всё так просто, тут и начинается моё близкое знакомство с магией таких ребят, как CoordinatorLayout, BottomSheetBehavior, а точнее с багом, который выпустили из виду разработчики, когда их писали. В статье будет описан процесс выявления бага, связанного с вложенной прокруткой внутри view-компонентов с поведением BottomSheetBehavior, а также способы его решения.

Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Views 7K
Comments 6

Проектирование непредсказуемого интеллекта в играх. Часть 1 — архитектура

Game development *Unity3D *Unreal Engine *Artificial Intelligence The future is here

Создаем персонажа, который сам решает, что ему стоит сделать с игроком.

В этой статье я познакомлю вас с методикой проектирования искусственного интеллекта под названием GOAP на примере игры Hitman.

Подобные методики редко применяются в СНГ, но более популярны в зарубежных студиях (чаще всего уровня ААА), где есть отдельный департамент разработки ИИ и вместо готовых ассетов проектируются интереснейшие поведения. Но чем плохо начать сейчас внедрять в наш геймдев эти техники и наконец сделать достойную триплэй игру?

Читать далее
Total votes 10: ↑10 and ↓0 +10
Views 12K
Comments 9