[dev] [commit] r996 - wwwbase
Cătălin Frâncu
cata at francu.com
Sat Sep 21 19:54:24 EEST 2013
A, și mai am o idee, Alin. Tot așa, dacă nu mai ai timp pentru ea, creează un TODO, că aș vrea tare mult să o văd făcută.
Ar fi mult mai user-friendly să faci select-urile la nivel de cuvânt, nu de caracter. Cu alte cuvinte, pentru „Ana are mere”, ar putea fi:
<select>opțiunile: Ana, Ană, Anâ, Ăna, ...</select>
<select>opțiunile: are, ăre, âre</select>
mere
Desigur, nu toate opțiunile vor fi prezente, ci numai cele permise de baza de date și/sau de filtrarea prin lista de InflectedForms.
Asta nu este chiar trivial deoarece, pentru a obține lista de opțiuni, trebuie să faci un produs cartezian al tuturor posibilelor diacritice din cuvânt. Astfel, pentru „fata”, literele 2-4 sunt toate posibile diacritice. Generezi 3 x 2 x 3 variante, după care le filtrezi prin InflectedForm și rămâi cu lista: fata, fată, fața, față, făta, fătă, făța, făță, fâța, fâță. Iar pe astea le poți prezenta ordonate după produsul frecvențelor, cumva.
Și sigur, unde există o singură variantă, nu mai afișa deloc un <select>. De exemplu, pentru „ziar” nu ai decât o singură variantă.
Cătălin
On 09/21/2013 09:44 AM, Cătălin Frâncu wrote:
> Arată perfect, cu două observații. Una minoră:
>
>> + foreach($forms as $form => $value) {
>> + if ($value > 0) {
>> + $buffer .= "<option value=\"".$charArray[$form]."\">".self::getToUpperOrToLower($charArray[$form], $middle)."</option>";
>> + }
>> + else {
>> + $i ++;
>> + }
>> + }
>> + $buffer .= '</select>';
>> +
>> + if ($i > 1) {
>
> Nu ai nevoie de variabila $i. Poți testa ultima linie cu if (count($forms) > 1).
>
> Și observația mai mare: este bine să eviți să generezi HTML din scriptul PHP (tagurile <select>, <option>, <div> și <textarea>). Ideea template-urilor este tocmai să separe HTML-ul de PHP. Îți sugerez să procedezi așa:
>
> - Stochează toate variantele și trimite-le către template;
> - Variantele sunt un tuplu de (text fără posibile diacritice, array de variante pentru următorul caracter).
> - Template-ul este cel care generează select-ul.
>
> De exemplu, Pentru textul „Ana are mere”, aș asambla vectorul
>
> (text => '', options => array('A', 'Ă', 'Â')),
> (text => 'n', options => array('a', 'ă', 'â')),
> (text => ' ', options => array('a', 'ă', 'â')),
> (text => 're mere', options => null)
>
> Iar în template ai face ceva de genul
>
> {foreach from=$choices item=c}
> {$c.text}
> {if $c.options} {* posibil ca ultimul element să nu mai aibă un vector de opțiuni *}
> <select>
> {foreach from=$c.options item=o}
> <otption value="{$o}">{$o}</option>
> {/foreach}
> </select>
> {/if}
> {/foreach}
>
> Mă rog, cam așa ceva.
>
> Cătălin
More information about the Dev
mailing list