т.е. вызывать я и так могу
[[!Gal1? &galdir=`assets/components/focus/images/gal` &id=`[[*id]]` &options=`w=1100&h=1100`]]
выкинув ту бесполезную строчку, а options присвою "'.$options.'" Спасибо за урок!) очень интересно!
Результат в обоих случаях одинаков.
Я думаю, не стоит так сильно голову ломать. В 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 )
Я прадва не понимаю :-(
Ну а вообще, здорово, конечно, что так оперативно)
В принципе, строка
$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]]` ]]