<?php echo '<pre>'; $sourceA = array( 2 => 'object 2', 3 => 'object 3', 5 => 'object 5' ); $b = array( 3 => 'new instanceof object 3', 5 => 'new instanceof object 5', 8 => 'object 8', 10 => 'object 10', 15 => 'object 15', ); /** * Print source arrays */ $a = $sourceA; // set default array echo "Sources:\n"; echo "array a:\n"; print_r($a); echo "\narray b:\n"; print_r($b); echo "\n\n"; /** * array_merge result */ echo "Results:\n"; $a = array_merge($a, $b); ksort($a); echo "1. array_merge:\n"; print_r($a); $a = $sourceA; // set default array /** * (a + b) result */ $a = $a + $b; ksort($a); echo "\n\n2. summ (a + b):\n"; print_r($a); $a = $sourceA; // set default array /** * (b + a) result */ $a = $b + $a; ksort($a); echo "\n\n3. summ (b + a):\n"; print_r($a);
Sources: array a: Array ( [2] => object 2 [3] => object 3 [5] => object 5 ) array b: Array ( [3] => new instanceof object 3 [5] => new instanceof object 5 [8] => object 8 [10] => object 10 [15] => object 15 ) Results: 1. array_merge: Array ( [0] => object 2 [1] => object 3 [2] => object 5 [3] => new instanceof object 3 [4] => new instanceof object 5 [5] => object 8 [6] => object 10 [7] => object 15 ) 2. summ (a + b): Array ( [2] => object 2 [3] => object 3 [5] => object 5 [8] => object 8 [10] => object 10 [15] => object 15 ) 3. summ (b + a): Array ( [2] => object 2 [3] => new instanceof object 3 [5] => new instanceof object 5 [8] => object 8 [10] => object 10 [15] => object 15 )
Разве результат под номером 3 — это не то, что надо? Если нет, то я не понял задачу.
Начнем с того, что изначально все было не так, как надо. А если рассматривать предложенный вариант, то здесь не просто $a+$b; Здесь вот так:
$a; $b; $c = $a; $a = $c + $b;
Это не очевидно, но по сути примерно это и происходит, так как исходному массиву выполняется полное присвоение всех элементов. В случае же перебора имеющиеся уже объекты вообще никак не затрагиваются (только перетираются те, которые должны перетереться).
Hi, Andrew! Glad to see you here :) Thanks for sharing and for kind words.
Great explanation Nik, this is something I think the MODX community in general still haven't grasped. I am working on some Twig integration which I will probably do a core version in a fork of MODX just for Experimental use. It is said too often that designers don't like logic in template, but designers don't make templates anyway (besides designing them). Frontend developers make template, as since most are familiar with JavaScript they would have to create logic of some sort anyway.
I will share this on Twitter and hope others will understand the useful of having logic in templates, rather than a bunch of parsers parsing Snippets/Chunks and Templates.
Хм, может я чего не понимаю, конечно, но
$this->_relatedObjects[$alias]= array_merge($this->_relatedObjects[$alias], $collection);
в $collection и в $this->_relatedObjects[$alias] и так будут разные интансы объектов с одинаковым id, разве нет? И в результате операции
array_merge($this->_relatedObjects[$alias], $collection);
в $this->_relatedObjects[$alias] будут так же новые инстансы, пришедшие из $collection. Только array_merge затрёт ключи. А при сложении массивов (порядок элементов только другой) ключи не затрутся. Разве не это было нужно?
Сам синтаксис Smarty стандартный. По Smarty в инете полно проработанной мануалы. От меня только несколько тегов, специфических конкретно для MODX: {snippet}, {chunk} и т.п. По ним примеры есть прям на странице компонента: modx.com/extras/package/modxsmarty Там же есть демо-видео. Все остальное в рамках самого MODX-а. То есть, к примеру, вызываем {snippet name=test}. Происходит вызов $modx->runSnippet(). Далее все на уровне самого MODX-а.
А нет ли какой документации по работе с modxsmarty (как вызывать сниппеты, как глобальные переменные типа site_url выводить и т.д.)? Или синтаксис смарти смотреть в документации?
Вот еще небольшой примерчик:
{assign var=i value=1} <select> <option>Выбрать</option> {while $i <= $room.available} {assign var="mod" value=$i%100} <option>{$i} {if $mod > 4 && $mod < 20}номеров{elseif $mod==1}номер{else}номера{/if}</option> {$i++} {/while} </select>
То есть набивается select, и в зависимости от конкретного числа, используется склонение слова. ?
В общем было бы замечательно если бы modx из коробки поддерживал бы еще парочку шаблонизаторов на выбор)
Так он сейчас как бы и поддерживает (основное новшество версии 2.2.7, анонсированной на 9 апреля). Теперь можно переопределить системную настройку, и $modx->getParser() будет подтягивать ваш собственный парсер. Но я не уверен, что там все идеально (сужу по логике Смарти). Шаблонизатор компиллирует свои шаблоны, а не просто парсит какой-то код. Это включает подгрузку функций всяких и т.п. А если у нас в чанке код, я не могу сказать точно по поводу того, как Смарти будет кушать этот код. Есть ли возможность скармливать ему контент. Очень сомневаюсь, так как он подавится первой же фигурной скобкой. Может Twig лучше себя ведет? К любом случае, я считаю, что они должны сделать поддержку php-кода в шаблонах (на подобии того, как это у меня сделано в phpTemplates). В таком случае я четко знаю, что я выполню чистый php, пропишу там логику, и всегда буду уверен, где у меня реальный код, а где шаблонизация.