[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