т.е. вызывать я и так могу [[!Gal1? &galdir=assets/components/focus/images/gal
&id=[[*id]]
&options=w=1100&h=1100
]] выкинув ту бесполезную строчку, а options присвою "'.$options.'"
Спасибо за урок!) очень интересно!
Результат в обоих случаях одинаков. Я думаю, не стоит так сильно голову ломать. В php есть много способов реализации одного и того же.
php.net/manual/ru/function.array-diff-key.php array_diff_key — Вычисляет расхождение массивов, сравнивая ключи То есть он уже отделяет от массива все уникальные элементы, скорее всего для того, чтобы быть четко уверенным в том, что это в конечный массив попадет сумма именно уникальных элементов. А то мало ли какие подводные камни есть в этом суммировании. Я думаю, не стоит так сильно голову ломать. В php есть много способов реализации одного и того же. Джейсон — очень опытный разработчик с огромным стажем. Наверняка он применил оптимальный вариант.
Оператор + возвращает левый массив, к которому был присоединен правый массив. Для ключей, которые существуют в обоих массивах, будут использованы значения из левого массива, а соответствующие им элементы из правого массива будут проигнорированы. Т.е. при сложении $collection + $_relatedObjects (запись именно в таком порядке), если имеются одинаковые ключи и там, и там, то при совпадении ключей выберутся только ключи из $collection. Все остальные ключи из обоих массивов добавятся в результирующий массив. array_diff_key ( array array1, array array2 [, array ...] ) возвращает массив, содержащий все значения array1, имеющие ключи, не содержащиеся в последующих параметрах. Обратите внимание, что ассоциации сохраняются. При array_diff_key($_relatedObjects, $collection) мы получили расхождение этих массивов а потом добавляем к нему только что выкинутые ключи (+ $collection), т.о. заменив все ключи-дубликаты из $_relatedObjects ключами из $collection. Результат в обоих случаях одинаков.
Это снова я.. В чём разница между $collection + $_relatedObjects и array_diff_key($_relatedObjects, $collection) + $collection? $relatedObjects = array( 2 => 'object 2', 3 => 'object 3', 5 => 'object 5' ); $collection = array( 3 => 'new instanceof object 3', 5 => 'new instanceof object 5', 8 => 'object 8', 10 => 'object 10', 15 => 'object 15', );
$_relatedObjects = $relatedObjects; // set default array $_relatedObjects = $collection + $_relatedObjects; ksort($_relatedObjects); echo '$_relatedObjects = $collection + $_relatedObjects;' . "\n"; print_r($_relatedObjects);
echo "\n";
$_relatedObjects = $relatedObjects; // set default array $_relatedObjects = array_diff_key($_relatedObjects, $collection) + $collection; ksort($_relatedObjects); echo '$_relatedObjects = array_diff_key($_relatedObjects, $collection) + $collection;' . "\n"; print_r($_relatedObjects); $_relatedObjects = $collection + $_relatedObjects; Array ( [2] => object 2 [3] => new instanceof object 3 [5] => new instanceof object 5 [8] => object 8 [10] => object 10 [15] => object 15 )
$_relatedObjects = array_diff_key($_relatedObjects, $collection) + $collection; Array ( [2] => object 2 [3] => new instanceof object 3 [5] => new instanceof object 5 [8] => object 8 [10] => object 10 [15] => object 15 ) Я прадва не понимаю :-( Ну а вообще, здорово, конечно, что так оперативно)
Дополнительная информация по теме: tokarchuk.ru/2011/05/geolocation-geoip-in-php/ php.net/manual/ru/ref.geoip.php www.phpandstuff.com/articles/geoip-country-lookup-with-php
Отличная новость! Багу пофиксили: github.com/modxcms/xpdo/commit/e5b28ec2cbea150d591eb07d1768ad97dc53895a
В принципе, строка $name = $scriptProperties['name']; не нужна — MODX и сам создает переменные по именам всех параметров, так что можно получить доступ к значению любого параметра двумя способами — написать $name или $scriptProperies['name'] Кстати, есть еще одна фишка. Если написать так: [[*pagetitle:Gal=assets/images/gal
]] то в сниппете значение [[*pagetitle]] будет помещено в переменную $input, а путь — в переменную $options (это сделано для того, чтобы можно было создавать свои модификаторы помимо стандартных, типа [[*longtitle:default=[[*pagetitle]]
]]). Кстати, сниппет phpthumbof является таким модификатором. И параметры в него можно передавать так: [[+tv.img:phpthumbof=w=50&h=50&zc=1
]] или так: [[phpthumbof? &input=[[+tv.img]]
&options=w=50&h=50&zc=1
]] Теперь можно легко понять, что это за строчка такая в сниппете: $modx->runSnippet('phpthumbof', array("input" => "/$galdir/$file"
, "options" => "w=1100&h=1100"));
Для одного проекта потребовалось определение из какого города/региона пользователь. Вот написал пакет Geoip. Просто качаете пакет из нашего репозитория, заливаете его на сайт в папку core/packages/ и устанавливаете локально. Использование: // Подключаем пакет $modx->addPackage('Geoip', $modx->getOption('core_path').'components/geoip/model/');
// Подгружаем основной класс (он содержит нужные нам статические методы) $modx->loadClass('Geoip');
// Быстрый метод получить информацию о расположении // Возвращает объект Geoip с полной информацией, // включая город, регион, область, широта/долгота и т.п. $location = Geoip::findByIp($modx);
// Или формируем xPDOCriteria для более гибких запросов $query = Geoip::newQuery($modx); Пока что база только России и Украины, но в дальнейшем можно развить ее. Основным плюсом использования именно локальной базы, а не он-лайн сервисов, можно назвать производительность. Если вы используете он-лайн сервисы, и при заходе пользователя удаленный сервис затормозит, пока мы будем пытаться получить ответ, страница для пользователя так же будет висеть. А здесь все мгновенно проходит.
да блин оказывается все просто, надо просто прочитать))) $name = $scriptProperties['name']; и вызываю [[!Gal1? &galdir=assets/components/focus/images/gal
&name=[[*pagetitle]]
]]